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();