Javascript 删除重复对象,但将属性推送到剩余对象上的数组
我有一个这样的对象数组:Javascript 删除重复对象,但将属性推送到剩余对象上的数组,javascript,arrays,underscore.js,Javascript,Arrays,Underscore.js,我有一个这样的对象数组: [ { "id": "1", "location": "US" }, { "id": "7", "location": "US" }, { "id": "1", "location": "France" }, { "id": "1", "location": "China" } ] 我希望最终得到一个如下所示的数组: [ { "id": "1", "lo
[
{
"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)
这与上的现有问题不同,因此只需询问删除重复项即可。我的目标是删除重复项,同时在“幸存”对象的数组中保留这些重复项的某些属性值。纯Javascript解决方案
var data=[{“id”:“9”},{“id”:“1”,“位置”:“US”},{“id”:“7”,“位置”:“US”},{“id”:“1”,“位置”:“法国”},{“id”:“1”,“位置”:“中国”},
结果=[];
data.forEach(函数(a){
a、 位置和结果。部分(函数(b){
如果(a.id==b.id){
b、 位置。推(a.位置);
返回true;
}
})&&result.push({id:a.id,位置:[a.location]});
});
document.write(“”+JSON.stringify(结果,0,4)+“”)代码>您可以使用reduce函数转换数组
var result = _.chain(data)
.groupBy('id')
.map(function(group, id){
return {
id: id,
locations: _.pluck(group, 'location')
}
})
.value();
以及使用下划线的版本:
原生JS可以很好地处理这一问题,特别是使用一些新的ES6特性。它必须是下划线吗?@SterlingArcher它不需要是下划线。我使用下划线,所以我只想提到,如果有一些方法可以轻松地使用下划线方法来实现这一点。可能的重复如果要删除所有具有重复位置的对象,是否可以仅使用一个循环来完成?箭头,应该可以通过查找或使用映射/集或对象作为哈希表来实现。map和set之间的决定是位置是否自身唯一,没有id
。如果您还需要id
,则需要一个用于分组的映射。nice将尝试。我不知道你对回答迟交的问题有什么感觉,因为已经有了一个选定的答案。这可能不值得你花时间,但我喜欢你解决这些问题的方式。如果你感兴趣的话,问题就在这里。
var result = _.chain(data)
.groupBy('id')
.map(function(group, id){
return {
id: id,
locations: _.pluck(group, 'location')
}
})
.value();