首页 > 解决方案 > 覆盖对象的所有键,但其 id

问题描述

我有一个和这个类似的对象,但它有更多的键。我想更新它的所有键,但 id。我可以手动完成。但我认为这不是最好的方法。

const o = {
  name: "unknow",
  key: "key"
  value: "value"
  id ": 12
}


如何更新/覆盖对象的所有键,但 id?

更新

这两个对象具有相同的键。但他们的钥匙有不同的价值。我需要更新第一个对象的所有键,不包括它的 id。

标签: javascript

解决方案


我怀疑您正在寻找类似的东西:它设置了on但指定的assignBut属性:oboa

const assignBut = (prop, oa, ob) => {
  for (let key of Object.keys(ob))
    // Check that I also verify that the property
    // to set should be part of "oa" object. This
    // prevents adding new properties: it just updates 
    // existing ones.
    if (key !== prop && oa.hasOwnProperty(key))
      oa[key] = ob[key]
}

const oa = {
  name: "unknow",
  key: "key",
  value: "value",
  id: 12
}

const ob = {
  name: "xxx",
  key: "yyy",
  value: "zzz",
  other: "aaa",
  yetAnother: 289,
  id: 15
}

assignBut('id', oa, ob)

console.log(oa)

省略给定属性的另一种方法

可以利用解构和计算属性名称来省略整个给定属性,因此for..of只需要检查每个属性 fromob是否存在oa以设置它。

此外,可以保存检查以验证在执行和键的交集时ob存在的属性:oaoaob

const oa = {
  name: "unknow",
  key: "key",
  value: "value",
  id: 12
}

const ob = {
  name: "xxx",
  key: "yyy",
  value: "zzz",
  other: "aaa",
  yetAnother: 289,
  id: 15
}

const intersect = (xs, ys) => xs.filter(x => ys.includes(x))

const assignBut = (prop, oa, {
  [prop]: omitted,
  ...ob
}) => {
  const sharedKeys = intersect(Object.keys(oa), Object.keys(ob))

  for (let key of sharedKeys)
    oa[key] = ob[key]
}

assignBut('id', oa, ob)

console.log(oa)


推荐阅读