这是我在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));
答案 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));