仅推送数组中的唯一元素

我有数组对象(x)存储json(键,值)对象。 我需要确保x只使用具有唯一键的json对象。 下面,示例’id’是键,因此我不想使用’item1’键存储其他json对象。

x = [{"id":"item1","val":"Items"},{"id":"item1","val":"Items"},{"id":"item1","val":"Items"}] var clickId = // could be "item1", "item2".... var found = $.inArray(clickId, x); // if(found >=0) { x.splice(found,1); } else{ x.push(new Item(clickId, obj)); //push json object } 

这会完成你想要的吗? https://jsfiddle.net/gukv9arj/3/

 x = [ {"id":"item1","val":"Items"}, {"id":"item1","val":"Items"}, {"id":"item2","val":"Items"} ]; var clickId = []; var list = JSON.parse(x); $.each(list, function(index, value){ if(clickId.indexOf(value.id) === -1){ clickId.push(value.id); } }); 

您不能使用inArray()因为您正在搜索object

我建议使用Array.some()重写自定义查找,如下所示。

 var x = [{"id":"item1","val":"Items"},{"id":"item1","val":"Items"},{"id":"item1","val":"Items"}] var clickId = "item1"; var found = x.some(function(value) { return value.id === clickId; }); alert(found); 

这是我在纯JavaScript中的方式。

 var x = [{"id":"item1","val":"Items"},{"id":"item1","val":"Items"},{"id":"item1","val":"Items"}]; function unique(arr, comparator) { var uniqueArr = []; for (var i in arr) { var found = false; for (var j in uniqueArr) { if (comparator instanceof Function) { if (comparator.call(null, arr[i], uniqueArr[j])) { found = true; break; } } else { if (arr[i] == uniqueArr[j]) { found = true; break; } } } if (!found) { uniqueArr.push(arr[i]); } } return uniqueArr; }; u = unique(x, function(a,b){ return a.id == b.id; }); console.log(u); y = [ 1,1,2,3,4,5,5,6,1]; console.log(unique(y)); 

JS对象是用于跟踪唯一项目的绝佳工具。 如果以空对象开头,则可以逐步添加键/值。 如果对象已具有给定项的键,则可以将其设置为某个已知值,该值用于指示非唯一项。

然后,您可以遍历对象并将唯一项目推送到数组。

 var itemsObj = {}; var itemsList = []; x = [{"id":"item1","val":"foo"}, {"id":"item2","val":"bar"}, {"id":"item1","val":"baz"}, {"id":"item1","val":"bez"}]; for (var i = 0; i < x.length; i++) { var item = x[i]; if (itemsObj[item.id]) { itemsObj[item.id] = "dupe"; } else { itemsObj[item.id] = item; } } for (var myKey in itemsObj) { if (itemsObj[myKey] !== "dupe") { itemsList.push(itemsObj[myKey]); } } console.log(itemsList); 

请参阅此处的工作示例: https : //jsbin.com/qucuso

如果您想要一个仅包含第一个id实例的项目列表,您可以这样做:

 var itemsObj = {}; var itemsList = []; x = [{"id":"item1","val":"foo"}, {"id":"item2","val":"bar"}, {"id":"item1","val":"baz"}, {"id":"item1","val":"bez"}]; for (var i = 0; i < x.length; i++) { var item = x[i]; if (!itemsObj[item.id]) { itemsObj[item.id] = item; itemsList.push(item); } } console.log(itemsList);