删除重复的对象,但将 属性 推入剩余对象的数组
Remove duplicate objects, but push property to array on remaining object
我有一个像这样的对象数组:
[
{
"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
属性.
的重复对象(按 id)
这与 SO 上的现有问题不同,后者仅询问有关删除重复项的问题。我的目标是删除重复项,同时在 'surviving' 对象的数组中保留这些重复项中的某些 属性 值。
简单的解决方案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>');
您可以使用 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;
}, []);
以及使用下划线的版本:
var result = _.chain(data)
.groupBy('id')
.map(function(group, id){
return {
id: id,
locations: _.pluck(group, 'location')
}
})
.value();
我有一个像这样的对象数组:
[
{
"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 上的现有问题不同,后者仅询问有关删除重复项的问题。我的目标是删除重复项,同时在 'surviving' 对象的数组中保留这些重复项中的某些 属性 值。
简单的解决方案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>');
您可以使用 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;
}, []);
以及使用下划线的版本:
var result = _.chain(data)
.groupBy('id')
.map(function(group, id){
return {
id: id,
locations: _.pluck(group, 'location')
}
})
.value();