在jquery代码中从数组中移除重复对象不工作

Removing Duplicate object from array in jquery code not working

本文关键字:对象 工作 jquery 代码 数组      更新时间:2023-09-26

这是我的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));

函数$.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

您需要根据唯一的名称/值筛选数组。下面是一些纯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));

这是因为这两个对象是不同的,尽管其中的所有属性都是相同的。从

可以看到
console.log(result[0] === result[2]);

结果为false。

相反,您需要基于唯一标识符(例如name &标签如下:

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