在对象列表上使用.reduce()

Mor*_*len 4 javascript

我有这个样本数据集:

let list = [
  {'first': 'morgan', 'id': 1},
  {'first': 'eric', 'id': 1},
  {'first': 'brian', 'id': 2 },
  {'first': 'derek', 'id' : 2},
  {'first': 'courtney', 'id': 3},
  {'first': 'eric', 'id': 4},
  {'first': 'jon', 'id':4},
]
Run Code Online (Sandbox Code Playgroud)

我想结束这个:

[[1, [morgan, eric]], [2, [brian, derek]], [3, [courtney]], [4, [eric, jon]]
Run Code Online (Sandbox Code Playgroud)

我正在使用该.reduce()函数来映射列表.但是,我有点卡住了.

我有这个工作:

let b = list.reduce((final_list, new_item) => {
  x = final_list.concat([[new_item.id, [new_item.first]]])
  return x
}, [])
Run Code Online (Sandbox Code Playgroud)

但是,这会将列表展平为列表列表,但不会合并共享相似ID的名称.

我尝试使用.map() 下面的代码不起作用

我试图映射到final_list(这是[id,[names]]的列表,看看是否new_item存在的id smaller_list然后添加new_item.firstsmaller_list[1](应该是名称列表).

这是正确的方法吗?

let b = list.reduce((final_list, new_item) => {
  final_list.map((smaller_list) => {
    if (smaller_list.indexOf((new_item.id)) >=0) {
      smaller_list[1].concat(new_item.first)
      // not sure what to do here...
    } else {
        // not sure what to do here either...
    }

  })
  x = final_list.concat([[item.id, [item.first]]])
  return x
}, [])
Run Code Online (Sandbox Code Playgroud)

der*_*erp 5

在我的方法中,我使用reduce创建一个稀疏数组,索引作为列表id.然后我用Object.values它来压扁它.

let list = [
  {'first': 'morgan', 'id': 1},
  {'first': 'eric', 'id': 1},
  {'first': 'brian', 'id': 2 },
  {'first': 'derek', 'id' : 2},
  {'first': 'courtney', 'id': 3},
  {'first': 'eric', 'id': 4},
  {'first': 'jon', 'id':4}
];

let result = list.reduce( (acc, item, index) => {
  if(acc[item.id]){
  	acc[item.id][1].push(item.first);
  } else {
  	acc[item.id] = [item.id, [item.first]];
  }
  return acc;
}, []);

console.log(Object.values(result));
Run Code Online (Sandbox Code Playgroud)