javascript - 根据唯一ID确定是否推送或更新数组中的对象

标签 javascript arrays object push

我正在尝试编写一个基本函数,该函数将根据此对象内部的唯一 ID 作为属性来确定该对象是否已存在于对象数组中。经过搜索,我想到了这段代码,它似乎工作正常,但我可以想象有一种更好更快的方法来确定是推送还是更新对象。如果您可以分享您对此的最佳答案,请...

var myArray = [
  {
    id: 1,
    car: "Ford"
  },
  {
    id: 2,
    car: "Honda"
  }
];

var objToOverwrite = {
  id: 1,
  car: "Bentley" // to overwrite car: "Ford"
};

var objToPush = {
  id: 3,
  car: "Toyota"
};


function pushToArray ( arr, obj ) {


  var existingIds = arr.map((obj) => obj.id);

    if (! existingIds.includes(obj.id)) {
      arr.push(obj);
    } else {
      arr.forEach((element, index) => {
        if (element.id === obj.id) {
          arr[index] = obj;
        };
      });
    };
};

pushToArray ( myArray, objToPush );

console.log(myArray);

最佳答案

如果您想将其减少到 1 次迭代,您可以这样做: (请注意,这是代码的不可变版本,因此它将返回一个包含结果的新数组,而不是改变原始数组)

function pushToArray ( arr, obj ) {
  let updated = false

  let result = arr.map(el => {
    if (obj.id === el.id) {
      updated = true
      return obj
      // or maybe you want to merge objects here? return Object.assign({}, el, obj)
    }

    return el
  })

  if (!updated) {
    result.push(obj)
  }

  return result
}

您还可以考虑使用由 id 键控的对象而不是数组。它会简化逻辑:

let cars = {
  1: {
    id: 1,
    car: 'Ford',
  },
  2: {
    id: 2,
    car: 'Honda',
  }
}

function updateData ( data, obj ) {
  // again, an immutable version. You can make this mutable by removing the first {}
  return Object.assign({}, data, {
    [obj.id]: obj
  })
}

并且您始终可以在需要时将值转换为数组:

Object.values(cars) // => your original array

关于javascript - 根据唯一ID确定是否推送或更新数组中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50898249/

相关文章:

javascript - 只使用一次数组元素

javascript - 在 onsubmit 事件上获取表单的 id

javascript - 未调用 polymer 按键事件处理程序

C++:获取数组中char元素的索引

c++ - 谁能解释一下这个特定的 print 语句在 for 循环中做了什么?

javascript - 有没有办法在JS中将一个键的值设置为与同一对象中另一个键的值相同?

java - 是否可以使用仅在使用此枚举时定义的变量创建枚举?

javascript - 使用 casperjs 或新浏览器登录时网站要求输入验证码

c++ - 访问用户定义类型数组的特定属性

symfony - 如何使用内部带有 @ 符号的 twig 对象变量