防止将重复的对象添加到数组?

时间:2019-09-01 14:53:17

标签: javascript arrays object

我正在为客户建立一家小商店,并将信息存储为一组对象。但是我想确保不创建“重复的”对象。我见过类似的解决方案,但是也许这是我的“新颖性”,使我无法在自己的代码中实现要点,因此我想针对自己的工作提出一些建议。

我尝试将代码放入if外观中,如果代码中没有寻找零件编号的变量“ 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对我来说都是全新的。谢谢。

5 个答案:

答案 0 :(得分:0)

您可以创建一个proxy并使用Map来保存和访问值,诸如此类

let cart =  new Map([{ id: 1, title: "Dog toy" }, { id: 2, title: "Best of Stackoverflow 2018" }].map(v=>[v.id,v]));

let handler = {
  set: function(target,prop, value, reciver){
     if(target.has(+prop)){
      console.log('already available')
     } else{
      target.set(prop,value)
     }
  },
  get: function(target,prop){
    return target.get(prop)
  }
}

let proxied = new Proxy(cart, handler)

proxied['1'] = {id:1,title:'Dog toy'}
proxied['3'] = {id:3,title:'Dog toy new value'}

console.log(proxied['3'])

答案 1 :(得分:0)

假设“ part”属性在每个cartData上都是唯一的,那么我仅基于该属性进行检查。

  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(arr[0] === obj.part && arr[1] === obj.description)替换if语句。

答案 2 :(得分:0)

感谢大家的建议。使用此方法并在朋友的帮助下,这是有效的解决方案:

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); 
    }

答案 3 :(得分:-1)

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

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

let cart =  [{ id: 1, title: "Dog toy" }, { id: 2, title: "Best of Stackoverflow 2018" }];

function isInCart(id) {
  return cart.some(obj => obj.id === id);
}

console.log(isInCart(1));
console.log(isInCart(3));

另一种方法是按ID将项目保存在对象中

let cart = { 1: { title: "Dog toy" }, 2: { title: "Best of Stackoverflow 2018" } };

function isInCart(id) {
  if(cart[id]) return true;
  
  return false;
}

答案 4 :(得分:-1)

尝试使用indexOf检查对象是否存在,例如:

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

console.log(beasts.indexOf('aaa'));
// expected output: -1