JavaScript:根据特定属性检查对象数组是否没有重复项?

时间:2013-02-06 17:06:06

标签: javascript dojo

我有一个对象数组,对象看起来像这样:

{name: "object1", type: "event", props: {internalid: 1}}
{name: "object2", type: "event", props: {internalid: 1}}

我想循环遍历这些对象的数组,我想创建一个没有重复的对象的新数组(对于我来说,如果internalId中的props具有相同的internalId,则两个项目是重复的} property)

我想知道什么是最好和最有效的方法来获得"独特"原始数组中的对象以及基于{{1}}属性的新对象?

谢谢

3 个答案:

答案 0 :(得分:0)

你最好的方法可能是创建一个新的空数组并简单地遍历原始数组,如果它们尚不存在,则将元素添加到新数组中(基于您的唯一定义)。我不认为你的解决方案比这简单得多。

答案 1 :(得分:0)

您可以使用uniqUnderscore中的Lo-Dash方法轻松实现此目的。如果你的数组已经排序,他们会优化一些东西。这两个库都有很好的文档代码,因此您可以随时查看他们解决问题的方法。

以下是一个例子:

var objs = [{
    name: "object1",
    type: "event",
    props: {
        internalid: 1
    }
}, {
    name: "object2",
    type: "event",
    props: {
        internalid: 1
    }
}, {
    name: "object3",
    type: "event",
    props: {
        internalid: 2
    }
}];

var result = _.uniq(objs, false, function (item) {
    return item.props.internalid;
});

答案 2 :(得分:0)

这是使用Dojo array功能执行此操作的方法。过滤器使用包含您已经遇到的ID的临时对象。

require(["dojo/_base/array"], function(array){

    var data = []; // load the data

    var _lookup = {};
    var uniqueArray = array.filter(data, function(item) {
        var key = item.props.internalid;
        if(_lookup[key] !== true) {
            _lookup[key] = true;
            return true;
        }
        return false;
    });
    delete _lookup;

    //use uniqueArray
});