Javascript 仅推送数组中的唯一元素
我有一个存储json(键、值)对象的数组对象(x)。我需要确保x只接受具有唯一键的json对象。下面的示例“id”是键,因此我不想用“item1”键存储其他json对象Javascript 仅推送数组中的唯一元素,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有一个存储json(键、值)对象的数组对象(x)。我需要确保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 = $.inArra
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
}
这能完成你想要的吗
无法使用
inArray()
,因为您正在搜索对象
我建议按照如下方式重写自定义查找
var x=[{“id”:“item1”,“val”:“Items”},{“id”:“item1”,“val”:“Items”},{“id”:“item1”,“val”:“Items”}]
var clickId=“item1”;
var found=x.some(函数(值){
返回值.id==clickId;
});
警报(发现)代码>这就是我在纯javascript中的实现方式
var x=[{“id”:“item1”,“val”:“Items”},{“id”:“item1”,“val”:“Items”},{“id”:“item1”,“val”:“Items”}];
功能唯一(arr、比较器){
var uniqueArr=[];
用于(arr中的var i){
var=false;
for(uniqueArr中的变量j){
if(比较器实例函数){
if(comparator.call(null,arr[i],uniqueArr[j])){
发现=真;
打破
}
}否则{
if(arr[i]==uniqueArr[j]){
发现=真;
打破
}
}
}
如果(!找到){
单向推送(arr[i]);
}
}
返回uniqueArr;
};
u=unique(x,函数(a,b){返回a.id==b.id;});
控制台日志(u);
y=[1,1,2,3,4,5,5,6,1];
console.log(唯一(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);
var itemsObj={};
var itemsList=[];
x=[{“id”:“item1”,“val”:“foo”},
{“id”:“item2”,“val”:“bar”},
{“id”:“item1”,“val”:“baz”},
{“id”:“item1”,“val”:“bez”}];
对于(变量i=0;i
请参见此处的工作示例:
如果需要仅包含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);
var itemsObj={};
var itemsList=[];
x=[{“id”:“item1”,“val”:“foo”},
{“id”:“item2”,“val”:“bar”},
{“id”:“item1”,“val”:“baz”},
{“id”:“item1”,“val”:“bez”}];
对于(变量i=0;i
这已经晚了,但我做了如下操作:
let MyArray = [];
MyArray._PushAndRejectDuplicate = function(el) {
if (this.indexOf(el) == -1) this.push(el)
else return;
}
MyArray._PushAndRejectDuplicate(1); // [1]
MyArray._PushAndRejectDuplicate(2); // [1,2]
MyArray._PushAndRejectDuplicate(1); // [1,2]
使用lodash创建一个非常可读的解决方案
x=uu.unionBy(x,[newitem(clickId,obj)],'id')
看看如何使用对象而不是数组,并将id
作为属性名。然后它们就自动唯一了。@StoyanDekov JavaScript集在IE<11中使用对象比较会有所帮助,请看一下u.lodash这是一个非常有用的JavaScript实用程序库,它有一个名为u.isEqual的方法,可以执行深层对象比较。我想你不明白这个问题。他不是在搜索元素,他想删除重复的ID。也许,也许不是。从我理解问题的方式来看,他似乎有一个对象数组,并想确定数组中是否包含id
中具有特定属性的对象。不过你也可能是对的。他说我需要确保x只接受具有唯一密钥的json对象。谢谢你,@dave。它帮助了我。我只想检查我要推送的数据是否已经存在。goodmode:我想推送一个“Item”对象,而不仅仅是“id”。简单的修复,只需更改为clickId.push(value)代码>正在为您获取JSFIDLE,如果您愿意,为什么要使用JSFIDLE而不是?@Barmar,因为JSFIDLE更好
let MyArray = [];
MyArray._PushAndRejectDuplicate = function(el) {
if (this.indexOf(el) == -1) this.push(el)
else return;
}
MyArray._PushAndRejectDuplicate(1); // [1]
MyArray._PushAndRejectDuplicate(2); // [1,2]
MyArray._PushAndRejectDuplicate(1); // [1,2]
let x = [{id:item1,data:value},{id:item2,data:value},{id:item3,data:value}]
let newEle = {id:newItem,data:value}
let prev = x.filter(ele=>{if(ele.id!=new.id)return ele);
newArr = [...prev,newEle]