Javascript 防止将重复对象添加到阵列?

Javascript 防止将重复对象添加到阵列?,javascript,arrays,object,Javascript,Arrays,Object,我正在为客户建立一个小商店,并将信息存储为一个对象数组。但我想确保我没有创建“重复”对象。我见过类似的解决方案,但可能是因为我对编码的“新鲜感”使我无法在自己的代码中实现它们的要点,所以我想听听一些针对我所做工作的建议 我曾尝试将代码放入if-look,如果没有“part”,则代码中存在查找部件号的变量,然后添加部件,但无法使其发挥作用 以下是我正在处理的函数: function submitButton(something) { window.scroll(0, 0);

我正在为客户建立一个小商店,并将信息存储为一个对象数组。但我想确保我没有创建“重复”对象。我见过类似的解决方案,但可能是因为我对编码的“新鲜感”使我无法在自己的代码中实现它们的要点,所以我想听听一些针对我所做工作的建议

我曾尝试将代码放入if-look,如果没有“part”,则代码中存在查找部件号的变量,然后添加部件,但无法使其发挥作用

以下是我正在处理的函数:

   function submitButton(something) {
     window.scroll(0, 0);
     cartData = ($(this).attr("data").split(','));

     arrObj.push({
       part: cartData[0],
       description: cartData[1]
     });

   }
arrObj被定义为一个全局变量,我在这里使用的是“part”和“description”,这是我试图从其他地方保存并输出到我的“#cart”的数据。我让这个部分工作,我只是想确保用户不能添加相同的项目两次。(或更多次。)


对不起,如果我的代码是劣质的或我看起来无知;我目前是一名学生,正在努力解决这些问题,因此JS和Jquery对我来说是全新的。谢谢。

好的,你有多种可能的方法来解决这个问题。所有这些都需要您在用户可以添加的项目上指定某种标识符。通常,这只是一个ID整数

因此,如果您有该整数,可以执行以下检查以确保它不在对象数组中:

let cart=[{id:1,标题:“Dog toy”},{id:2,标题:“2018年最佳Stackoverflow”}];
函数isInCart(id){
返回cart.some(obj=>obj.id==id);
}
控制台日志(isInCart(1));

控制台日志(isInCart(3))尝试使用
indexOf
检查对象是否存在,例如:

var beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];

console.log(beasts.indexOf('aaa'));
// expected output: -1
您可以创建并使用
映射
来保存和访问值,类似这样

let cart=newmap([{id:1,标题:“Dog toy”},{id:2,标题:“2018年最佳Stackoverflow”}).Map(v=>[v.id,v]);
让处理程序={
设置:功能(目标、道具、值、接收器){
如果(目标有(+prop)){
console.log('已经可用')
}否则{
设置目标(道具、值)
}
},
获取:函数(目标、道具){
返回目标。获取(道具)
}
}
let proxied=新代理(购物车、处理程序)
代理['1']={id:1,标题:'Dog toy'}
代理['3']={id:3,标题:'Dog toy new value'}

log(proxied['3'])
假设每个cartData上的'part'属性都是唯一的,我只根据它进行了检查

  function submitButton(something) {
     window.scroll(0, 0);
     cartData = ($(this).attr("data").split(','));

     if(!isDuplicate(cartData))
     arrObj.push({
       part: cartData[0],
       description: cartData[1]
     });

   }

   const isDuplicate = (arr) => {
     for(obj of arrObj){
       if(arr[0] === obj.part) 
         return true;
     }

     return false;
   }

如果要同时检查“part”和“description”属性,可以将If语句替换为
If(arr[0]==obj.part&&arr[1]==obj.description)

感谢大家的建议。利用这一点和朋友的帮助,这是行之有效的解决方案:

function submitButton(something) {
  window.scroll(0,0);
  cartData = ($(this).attr("data").split(','));

let cartObj = {
  part: cartData[0],
  description: cartData[1],
  quantity: 1
}

match = false
arrObj.forEach(function(cartObject){
  if (cartObject.part == cartData[0]) {
  match = true;
}
})
console.log(arrObj);
if (!match) { 
    arrObj.push(cartObj); 
    }

forEach
中的
return
无效。不返回到外部功能否。不在arrow函数中如果(!arrObj.some(item=>item.part==cardData[0])arrObj.push(…)
(数组#some测试函数是否为任何元素返回true)我可以在你的商店里买两个相同的零件吗?乔治:可以,但这是在别处处理的,不是通过使用数据。所有这些都是发送一封电子邮件回来的,这样我就可以有一个不同的POST字段,在该字段中指定数量,并将该信息通过电子邮件发送给我的客户。它不需要影响现有的数据。@JoelPeterson对我的回答也是这样Chris G解决了你的问题…我希望这不是一个真正的客户和一个真正的商店。20年前这样的事情不是什么大问题,但现在你很快就会让那家商店遭到黑客攻击和欺诈。但是OP不能处理基元数组。不能使用
indexOf()
对于不同的对象引用,即使它们的所有属性和值都相同。这比使用.some()复杂得多,请看我的回答。