【问题标题】:Have an array of objects, need to add new object. How do I check if only one of key: value pairs exist有一个对象数组,需要添加新对象。如何检查是否只有一个键:值对存在
【发布时间】:2017-11-23 09:25:36
【问题描述】:

请指教。我有这个:

var x =[ { id: '1', item: 'item1', price: 'price1' }, 
         { id: '2', item: 'item2', price: 'price2' }
       ]

我需要能够不断向这个数组添加新对象,但只有条件,只有id 应该是唯一的。 所以我应该不能添加像

这样的对象
{id: '2', item: 'item3', price: 'price3'}

并且能够添加类似的东西

{id: '3', item: 'item2', price: 'price3'}

如何检查我的这种情况?

基本上,除了id 之外的所有其他内容都可以重复。 请不要jQuery

提前谢谢你!!!

【问题讨论】:

  • 什么实际上不起作用?
  • 简单:跟踪数组中已有的 id 并在添加新对象之前检查。
  • Nina,目前可以添加一个 id 已经属于某个对象的新对象,例如 id: 2
  • @EFFG 那是因为你在添加之前没有任何条件。
  • Suresh,你已经为我做到了。谢谢你,伙计.. 为什么我没有首先想到映射 id :)

标签: javascript arrays object


【解决方案1】:

将所有 id 放入一个数组中,然后检查给定的对象 id 是否存在于该数组中

例如:

var allids = x.map(obj => obj.id); // Es 6

if(allids.indexOf(currentObj.id) > -1) {   
  // exist. don't add.
}else {    
 // add
}

如果你不想要 ES6 线,

var allids = x.map(function(obj) {return obj.id;});

【讨论】:

  • 你可以用find代替mapindexOf
  • 添加新对象后还需要更新allids
  • @RohitAgrawal 这将在里面添加函数,所以每次都会执行。
  • @Xufox 但我发现 indexOf 对性能更友好,includes 是最好的jsperf.com/js-multiloop
【解决方案2】:
function addObjectToArray(arr,obj){
    var findEle = arr.find(function(o){
        return o.id === obj.id;
    })
    if(findEle === undefined){
        arr.push(obj);
    }
    return arr;
}

【讨论】:

    【解决方案3】:

    过滤救援

    var x =[ { id: '1', item: 'item1', price: 'price1' }, 
             { id: '2', item: 'item2', price: 'price2' }
           ]
     
    addToX(x,{ id: '2', item: 'item2', price: 'price2' }) // will throw duplicates
    addToX(x,{ id: '4', item: 'item2', price: 'price2' }) // NO duplicates
    
    function addToX(obj,newObj) {
       let duplicates = obj.filter((eachObj) => {   			
            return eachObj["id"] == newObj["id"]
       })
       console.log(duplicates, "duplicates")
    }

    【讨论】:

      【解决方案4】:

      您可以为此使用lodash's groupBy

      例如

      var x = [ 
               { id: '1', item: 'item1', price: 'price1' }, 
               { id: '2', item: 'item2', price: 'price2' }
             ];
      
      const addToX = (object) => {
          if(!_.groupBy(x, 'id')[object.id]){
              x.push(object);
          }
      }
      

      如果您不想在运行时计算 groupBy 对象并且也不想在 groupBy 对象中创建条目,或者您只想在最初拥有 groupBy 对象而不是创建一个对象数组,则可以最初存储 groupBy 对象。

      【讨论】:

        【解决方案5】:

        我们可以使用现有的 id 作为字典

        var x =[ { id: '1', item: 'item1', price: 'price1' }, 
                 { id: '2', item: 'item2', price: 'price2' }
               ]
        var exisingIds = x.reduce(function(res,obj){
          res[obj.id]=true
          return res;
        },{})
        
        
        function add2(item){
          if(!exisingIds[item.id]){
            x.push(item)
            exisingIds[item.id]=true;
          }
        }
        add2({ id: '3', item: 'item3', price: 'price3' })// will be added 
        add2({ id: '3', item: 'item3', price: 'price3' }) // this will not
        console.log(x); 
        

        【讨论】:

        猜你喜欢
        • 2018-07-01
        • 2022-10-01
        • 1970-01-01
        • 2021-02-14
        • 1970-01-01
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        • 2019-10-01
        相关资源
        最近更新 更多