Javascript 将对象列表转换为地图中的地图

Javascript convert list of objects to map of maps

我是 Javascript 的新手。 我正在使用 javascript.
将对象列表转换为地图的地图 下面是我写的代码。

var person = {
  firstName: "John",
  lastName: "Doe",
  rank: 0,
  rollNo: "0201",
  school: "test",
  id: 0
};
var person1 = {
  firstName: "John1",
  lastName: "Doe1",
  rank: 0,
  rollNo: "0201",
  school: "test1",
  id: 1
};
var testList = []
var testList1 = []
var slotObject = {}
var slotObjectMap = {};
var finalObject = {};
testList.push(person);
testList.push(person1);
console.log(testList);
for (let i = 0; i < testList.length; i++) {
  slotObject["firstName"] = testList[i].firstName;
  slotObject["lastName"] = testList[i].lastName;
  slotObject["rollNo"] = testList[i].rollNo;
  slotObject["rank"] = testList[i].rank;
  slotObject["school"] = testList[i].school;
  testList1.push(slotObject);
  if (finalObject[testList[i]]) {
    console.log("yes");
    slotObjectMap = {};
  } else {
    slotObjectMap = finalObject[testList[i].school];
  }

  slotObjectMap[testList[i].id] = slotObject;
  finalObject[testList[i].school] = slotObjectMap;

}

console.log(slotObjectMap);
console.log(finalObject);
// Display some data from the object:
document.getElementById("demo").innerHTML =
  person.firstName;
<h2>JavaScript Objects</h2>

<p id="demo"></p>

我的预期输出是:

{ test:{
   0:{firstName: "John", lastName:"Doe", rank:0, rollNo:"0201", school:"test"}, 
   }, 
 test1:{
   1:{firstName: "John1", lastName:"Doe1", rank:0, rollNo:"0201", school:"test1"}
   }
}

我上面的代码没有按预期工作。不确定哪里出了问题。
请帮忙。

我的最终目标是将上面的对象(person, person1) 隐藏到下面的输出中。这可以使用数组减少吗?

[ { additionalInfo : ''
  , school         : 'test'
  , randomValue    : ''
  , studentInfo: 
    [ { rank      : 0
      , rollNo    : '0201'
      , firstName : 'John'
      , lastName  : 'Doe'
  } ] } 
, { additionalInfo : ''
  , school         : 'test1'
  , randomValue    : ''
  , studentInfo: 
    [ { rank      : 0
      , rollNo    : '0201'
      , firstName : 'John1'
      , lastName  : 'Doe1'
  } ] } 
] 

不能 100% 确定您的所有带有 slotObject 等的代码都是关于什么的。

但是看看您的预期输出,您似乎想使用 reduce,以 school 作为键,您可以使用它来 reduce into..

例如

var person = {
  firstName: "John",
  lastName: "Doe",
  rank: 0,
  rollNo: "0201",
  school: "test",
  id: 0
};
var person1 = {
  firstName: "John1",
  lastName: "Doe1",
  rank: 0,
  rollNo: "0201",
  school: "test1",
  id: 1
};

const r = [person, person1].reduce(
  (a, v) => {
    //extract school & id,
    const {school, id, ...other} = v;
    //lets make sure school exists
    a[school] = a[school] || {};
    //lets add back school to other, and assign
    //and use id as another sub key into school.
    a[school][id] = {...other ,school};
    return a}, 
{});
  
console.log(r);
<h2>JavaScript Objects</h2>

<p id="demo"></p>

您不能使用 Array.map,因为此方法 return 一个数组,而您需要一个对象。
了解 array.reduce and Destructuring assignment

var person  = { firstName:"John",  lastName:"Doe",  rank:0, rollNo:"0201", school:"test",  id:0 }
 ,  person1 = { firstName:"John1", lastName:"Doe1", rank:0, rollNo:"0201", school:"test1", id:1 }
 ;
let testList = [ person, person1 ]

let result = testList.reduce((r,{school, id, ...info})=>
      {
      r[school] = {}
      r[school][id] = {...info, school } 
      return r
      }
      ,{}) 

console.log( result )
.as-console-wrapper { max-height: 100% !important; top: 0; }

问题更新
(以及 PO 的评论部分 - 在聊天中)

let testList =
      [ { firstName:"John",  lastName:"Doe",  rank:0, rollNo:"0201", school:"test",  id:1 }
      , { firstName:"John1", lastName:"Doe1", rank:0, rollNo:"0201", school:"test1", id:2 }
      , { firstName:"John2", lastName:"Doe2", rank:0, rollNo:"0202", school:"test1", id:3 }
      , { firstName:"John3", lastName:"Doe3", rank:0, rollNo:"0203", school:"test",  id:5 } 
      ]
 ,  result = 
      testList.reduce((res,{ firstName, lastName, rank, rollNo, school })=>
        {
        let line = res.find(x=>x.school===school)
        if (!line) 
          {
          line = { additionalInfo:'', school, randomValue:'', studentInfo:[] }
          res.push(line)
          }
        line.studentInfo.push({ rank, rollNo, firstName, lastName }) 
        return res 
        }
        ,[] ) 

console.log( result )
.as-console-wrapper { max-height: 100% !important; top: 0; }