对象中嵌套的重复数组

时间:2015-01-09 01:19:00

标签: javascript underscore.js lodash

我正在尝试获取一系列对象并做两件事。

1。)从数组中删除重复的对象,创建一个新数组,其中包含重复项的名称。

原件:

var duplicates = [];

var objects = [
    {
        name: 'foo',
        nums: [1,2]
    },
    {
        name: 'bar',
        nums: [3,2]
    },
    {
        name: 'baz',
        nums: [1,2]
    },
    {
        name: 'bum',
        nums: [2,3]
    },
    {
        name: 'bam',
        nums: [1,2]
    },
]

期望的输出:

duplicates = ['foo', 'baz', 'bam'];

objects = [
    {
        name: 'bar',
        nums: [3,2]
    },
    {
        name: 'bum',
        nums: [2,3]
    }
]

任何人都可以帮忙吗?我在我的项目中使用lodash。

2 个答案:

答案 0 :(得分:1)

如果nums数组中元素的顺序很重要:

_.pluck(_.flatten(_.filter(_.groupBy(objects, "nums"), function(el) {
   return (el.length !== 1)
})), "name")

或者有点整洁

var hmap = _(objects).groupBy("nums").values();
var unique = hmap.where({'length': 1}).flatten().value();
var duplicates = hmap.flatten().difference(unique).value();

答案 1 :(得分:0)

我不知道underscore.js,这里是如何用普通JS做的:

var counts = {};
var duplicates = [];
for (var i = 0; i < objects.length; i++) {
    var str = JSON.stringify(objects[i].nums);
    if (str in counts) {
        counts[str]++;
    } else {
        counts[str] = 1;
    }
}
objects = objects.filter(function(val) {
  if (counts[JSON.stringify(val.nums)] == 1) {
    return true;
  } else {
    duplicates.push(val.name);
    return false;
  }
});

DEMO