对象中的嵌套重复数组

Nested duplicate arrays in objects

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

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。

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

我不知道 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