收集 JavaScript 数组中的唯一对象

新手上路,请多包涵

假设我有以下对象数组

var firstDataSet = [
  {'id': 123, 'name': 'ABC'},
  {'id': 456, 'name': 'DEF'},
  {'id': 789, 'name': 'GHI'},
  {'id': 101, 'name': 'JKL'}
];

var secondDataSet = [
  {'id': 123, 'name': 'ABC', 'xProp': '1q'},
  {'id': 156, 'name': 'MNO', 'xProp': '2w'},
  {'id': 789, 'name': 'GHI', 'xProp': '3e'},
  {'id': 111, 'name': 'PQR', 'xProp': '4r'}
];

现在我想收集具有唯一对象的数组(匹配 idname )即

var firstDataSet = [
  {'id': 123, 'name': 'ABC', 'xProp': '1q'},
  {'id': 456, 'name': 'DEF'},
  {'id': 789, 'name': 'GHI', 'xProp': '3e'},
  {'id': 101, 'name': 'JKL'},
  {'id': 156, 'name': 'MNO', 'xProp': '2w'},
  {'id': 111, 'name': 'PQR', 'xProp': '4r'}
];

我可以用

Array.prototype.unshift.apply(firstDataSet , secondDataSet );

但不确定如何过滤掉重复项。有什么建议吗?

编辑:我在两个不同数组上的对象不相同。至少基于属性的数量。

原文由 αƞjiβ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 335
2 个回答

删除具有所有相同特性的重复项

_这是最初的问题_。

使用 Set

Set 对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。

您还可以使用对象字面量。

 var list = [JSON.stringify({id: 123, 'name': 'ABC'}), JSON.stringify({id: 123, 'name': 'ABC'})];
var unique_list = new Set(list); // returns Set {"{'id': 123, 'name': 'ABC'}"}
var list = Array.from(unique_list); // converts back to an array, and you can unstringify the results accordingly.

有关将集合构造回数组的更多方法,您可以按照 此处 的说明进行操作。如果您不能使用 ES6(定义 Set 的内容),则可以使用适用于旧版浏览器的 polyfill


删除具有重复属性子集的对象

不幸的是,这些对象不再是严格重复的,并且不能使用例如 Set 以友好的方式处理。

解决此类问题的最简单方法是遍历对象数组,识别具有重复属性值的对象,并使用例如 splice 就地消除。

原文由 Akshat Mahajan 发布,翻译遵循 CC BY-SA 4.0 许可协议

这可以通过扩展 Set 类来实现,如下所示

    var firstDataSet = [
      {'id': 123, 'name': 'ABC'},
      {'id': 456, 'name': 'DEF'},
      {'id': 789, 'name': 'GHI'},
      {'id': 101, 'name': 'JKL'}
    ];

    var secondDataSet = [
      {'id': 123, 'name': 'ABC', 'xProp': '1q'},
      {'id': 156, 'name': 'MNO', 'xProp': '2w'},
      {'id': 789, 'name': 'GHI', 'xProp': '3e'},
      {'id': 111, 'name': 'PQR', 'xProp': '4r'}
    ];

    Array.prototype.unshift.apply(firstDataSet , secondDataSet );

    //console.log(firstDataSet)

    class UniqueSet extends Set {
            constructor(values) {
                super(values);

                const data = [];
                for (let value of this) {
                    if (data.includes(JSON.parse(value.id))) {
                        this.delete(value);
                    } else {
                        data.push(value.id);
                    }
                }
            }
          }

console.log(new UniqueSet(firstDataSet))

工作 链接

原文由 Shubham Dixit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题