Javascript 仅推送数组中的唯一元素

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

我有一个存储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 = $.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]