【问题标题】:check if an object with a specific key value exists in an array of objects检查对象数组中是否存在具有特定键值的对象
【发布时间】:2019-03-31 01:18:55
【问题描述】:

我正在尝试检查项目数组是否包含具有特定键值的对象,如果是,则使用新的项目对象更新项目数组

[{name: example1, quantity: 2},{name: example2, quantity: 3},{name: example3, quantity: 5}]

因此,例如,如果我要推送一个同名的“example1”对象,我想检查它是否存在于数组中,如果存在,只需使用具有新数量的新对象更新它例子。

我已尽力解释我想要什么,如果您需要更多说明,请告诉我。

【问题讨论】:

  • 这些对象是否只有namequantity 键?如果是这样,那么您应该只使用映射,而不是对象数组。如果对象中有更多的键,当你合并时这些键会发生什么?
  • 你真的应该添加a)你的对象数组的前/后示例(因为,根据答案,我不确定人们是否理解你想要的,b)你自己尝试的解决方案.

标签: javascript arrays reactjs object ecmascript-6


【解决方案1】:

您可以使用 Array#some()Array#find() 方法的简单组合:

if (data.some(o => o.name == toPush.name)) {
  data.find(o => o.name == toPush.name).quantity = toPush.quantity;
}

其中data 是您的arraytoPush 是您尝试更新的object

演示:

var data = [{
  name: "example1",
  quantity: 2
}, {
  name: "example2",
  quantity: 3
}, {
  name: "example3",
  quantity: 5
}];

let toPush = {
  name: "example2",
  quantity: 10
};

if (data.some(o => o.name == toPush.name)) {
  data.find(o => o.name == toPush.name).quantity = toPush.quantity;
}

console.log(data);

【讨论】:

  • 我认为这是理解问题的唯一答案
  • @Andy 谢谢,是的,他应该检查搜索到的对象是否存在并更新它。
【解决方案2】:
let arr1 = [{name: 'example1', quantity: 2},{name: 'example2', quantity: 3},{name: 'example3', quantity: 5}];
let obj1 = {name: 'example1', quantity: 5};
if(arr1.filter(item=> item.name === obj1.name).length==0){
  arr1.push(obj1);
}
else{
  arr1.filter(item=> item.name === obj1.name)[0].quantity = obj1.quantity;
}

【讨论】:

    【解决方案3】:

    我会使用Array.prototype.some() 函数:

    const arr = [{name: 'example1', quantity: 2},{name: 'example2', quantity: 3},{name: 'example3', quantity: 5}]
    
    
    var result = arr.some(e => e.hasOwnProperty('name') && e.hasOwnProperty('quantity'));
    
    console.log("The array contains an object with a 'name' and 'quantity' property: " + result);
    

    【讨论】:

      【解决方案4】:

      更好地使用Array.findIndex()

      let myArray = [{name: 'example1', quantity: 2},{name: 'example2', quantity: 3},{name: 'example3', quantity: 5}];
      const newItem = { name: 'example1', quantity: 5 };
      const indexOfItem = myArray.findIndex(item => item.name === item.name);
      
      if(indexOfItem === -1) { // not existing
        myArray.push(newItem);
      else {
        myArray[indexOfItem] = newItem;
      } 
      

      【讨论】:

        【解决方案5】:

        您可以使用Array.find() 进行更新并推送唯一对象。您还可以使用existObj = obj;,以便在现有对象上设置obj 的所有更新属性,而不仅仅是一个属性(就像现在quantity 一样)。但是,如果您只需要 quantity 属性来更新,那么请使用 existObj.quantity = obj.quantity;

        let arr = [{name: 'example1', quantity: 2},{name: 'example2', quantity: 3},{name: 'example3', quantity: 5}];
        let obj = {name: 'example1', quantity: 5};
        var existObj = arr.find(({name}) => name === obj.name);
        if(existObj){
          existObj = obj;
        } else {
          arr.push(obj);
        }
        console.log(arr);

        【讨论】:

          【解决方案6】:

          如果您想同时匹配对象键和值,这将起作用。

          let myArray = [{name: 'example1', quantity: 2},{name: 'example2', quantity: 3},{name: 'example3', quantity: 5}];
          let newObj = { name: 'example1', quantity: 5 };
          
          let myArrayJSON = JSON.stringify(myArray);
          let newObjJSON = JSON.stringify(newObj);
          
          if(myArrayJSON.indexOf(newObjJSON) === -1){
             myArray.push(newObj); 
          }
          

          【讨论】:

            【解决方案7】:

            您可以创建“推送”功能并传入您要添加/更新的对象。如果需要使用“find”添加/更新 arr,函数会小心处理。此外,这将处理所有属性,而不仅仅是“数量”

            var arr = [{name: 'example1', quantity: 2},{name: 'example2', quantity: 3},{name: 'example3', quantity: 5}]
            
            function push(obj) {
              var data = arr.find(({name}) => name == obj.name) || (arr = arr.concat({})).slice(-1)[0];
              Object.assign(data, obj)
            }
            
            push({ name: 'example11', quantity: 100 })
            console.log('example11 added', arr)
            
            push({ name: 'example1', quantity: 100 })
            console.log('example1 updated', arr)

            【讨论】:

              【解决方案8】:

              您可以使用Array.forEach 遍历每个对象,我们可以使用索引参数更新现有数组。

              请看下面的代码。

              var data = [{name: "example1", quantity: 2},{name: "example2", quantity: 3},{name: "example3", quantity: 5}]
              
              var object = {name: "example1", quantity: 14}
              
              data.forEach((o,index) => {
                if(o.name === object.name){
                  o.quantity = object.quantity
                  return data[index] = o
                }else{
                  data[index] = o
                }
              })
              
              
              console.log("updated data array =>", data)

              【讨论】:

                【解决方案9】:

                var ObjectArray = [{name: 'example1', quantity: 2},{name: 'example2', quantity: 3},{name: 'example3', quantity: 5}]
                    console.log(ObjectArray)
                   var name = 'example2'
                   var index = ObjectArray.findIndex(product => product.name == name);
                   if(index>=0){
                        console.log("Found and updated ObjectArray")
                       ObjectArray.splice(index, 1, {name: 'example2', quantity: 8});
                       console.log(ObjectArray)
                   }
                   else{
                      console.log("not found")
                   }

                【讨论】:

                • 欢迎来到 SO!此代码可能是一个很好的答案,但最好避免仅使用代码的答案并提供一些解释/上下文。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-12-15
                • 2012-11-12
                • 1970-01-01
                • 2017-06-23
                • 1970-01-01
                • 2021-12-10
                相关资源
                最近更新 更多