我有这个样本数据集:
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.first到smaller_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)
在我的方法中,我使用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)
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |