删除重复的对象,但将属性推送到剩余对象上的数组

时间:2015-12-09 16:38:37

标签: javascript arrays underscore.js

我有一组像这样的对象:

[
  {
    "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的问题不同,只是要求删除重复项。我的目标是删除重复项,同时还在“幸存”对象的数组中保留这些重复项中的某些属性值。

3 个答案:

答案 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;
&#13;
&#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