从jquery代码中的数组中删除重复对象不起作用

时间:2015-10-10 08:06:28

标签: javascript jquery

这是我在jquery中的数组,它包含重复的对象/元素:

[{
    "name": "hello",
    "label": "world"
}, {
    "name": "abc",
    "label": "xyz"
}, {
    "name": "hello",
    "label": "world"
}]

我正在使用以下代码删除重复元素,但不会删除重复元素。

var result = [];

$.each(subservices, function (i, e) {
    if ($.inArray(e, result) == -1)
        result.push(e);
});

alert(JSON.stringify(result));

3 个答案:

答案 0 :(得分:4)

函数$.inArray适用于简单类型(例如数字或字符串),但对于复杂类型,它不会产生正确的结果,因为它尝试通过引用进行匹配。您可以使用函数inArray搜索数组:

,而不是在循环中使用grep
var subservices = [{
        "name": "hello",
        "label": "world"
    }, {
        "name": "abc",
        "label": "xyz"
    }, {
        "name": "hello",
        "label": "world"
    }
];

var result = [];
$.each(subservices, function (i, e) {
    var matchingItems = $.grep(result, function (item) {
       return item.name === e.name && item.label === e.label;
    });
    if (matchingItems.length === 0){
        result.push(e);
    }
});

//displays result [{"name":"hello","label":"world"},{"name":"abc","label":"xyz"}]
alert(JSON.stringify(result));

这是一个有效的jsFiddle

答案 1 :(得分:1)

这是因为这两个对象是不同的,即使内部的所有属性都是相同的。您可以从以下地址看到:

console.log(result[0] === result[2]);

导致错误。

相反,您需要根据唯一标识符迭代数组,例如name&标签如下:

for(var i = 0, i < results.length; i++) {
    if (result[i].name === ... && result[i].label === ...) {
        index = i;
        break;
    }
}

检查您的商品是否唯一。

答案 2 :(得分:1)

您需要按唯一名称/值过滤数组。这是一些纯粹的JS解决方案:

var data = [{
    "name": "hello",
    "label": "world"
}, {
    "name": "abc",
    "label": "xyz"
}, {
    "name": "hello",
    "label": "world"
}];

var result = data.filter(function(el, i, x) {
    return x.some(function(obj, j) {
        return obj.name === el.name && (x = j);
    }) && i == x;
});

alert(JSON.stringify(result, null, 4));