我有一组像这样的对象:
[
{
"id": "1",
"location": "US"
},
{
"id": "7",
"location": "US"
},
{
"id": "1",
"location": "France"
},
{
"id": "1",
"location": "China"
}
]
我想得到一个如下所示的结果数组:
[
{
"id": "1",
"locations": ["US", "France", "China"]
},
{
"id": "7",
"locations": ["US"]
}
]
使用下划线是否有可靠的方法来实现这一目标?
我正在考虑循环遍历数组,并且每个id
循环遍历数组的其余部分并将location
值推送到第一个对象上的locations
数组(通过id) ,然后在最后删除所有不包含locations
属性的重复对象。
这与现有的关于SO的问题不同,只是要求删除重复项。我的目标是删除重复项,同时还在“幸存”对象的数组中保留这些重复项中的某些属性值。
答案 0 :(得分:3)
普通Javascript中的解决方案
var data = [{ "id": "9" }, { "id": "1", "location": "US" }, { "id": "7", "location": "US" }, { "id": "1", "location": "France" }, { "id": "1", "location": "China" }],
result = [];
data.forEach(function (a) {
a.location && !result.some(function (b) {
if (a.id === b.id) {
b.locations.push(a.location);
return true;
}
}) && result.push({ id: a.id, locations: [a.location] });
});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
答案 1 :(得分:1)
您可以使用reduce函数转换数组。
var data = [
{ "id": "1", "location": "US" },
{ "id": "7", "location": "US" },
{ "id": "1", "location": "France" },
{ "id": "1", "location": "China" }
];
var result = data.reduce(function (prev, item) {
var newItem = prev.find(function(i) {
return i.id === item.id;
});
if (!newItem) {
prev.push({id: item.id, locations: [item.location]});
} else {
newItem.locations.push(item.location);
}
return prev;
}, []);
答案 2 :(得分:1)
使用下划线的版本:
Group