json JS:检查是否存在深层对象键并替换值

vc9ivgsu  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(113)

我想开发一个函数来检查一个深层对象中是否存在一个键,然后用另一个对象的数据集替换那个键的值。
例如

var obj = {
    "id": 1,
    "component": "Preset 1",
    "priority": 1,

    "header": {
        "modeSet": 2
    }
}

const modeSets = [
    {
        "id": 1
        "name": "Mode Set 1"
    },
    {
        "id": 2
        "name": "Mode Set 2"
    }
]

function obtainModeSets(obj){
   //...
}

当函数obtainModeSets运行时,我想修改obj,使objmodeSet的值等于{ "id": 2 "name": "Mode Set 2" }
有人有什么建议吗?谢谢

ql3eal8s

ql3eal8s1#

可以像这样使用递归

const obj = {
  "id": 1,
  "component": "Preset 1",
  "priority": 1,

  "header": {
    "modeSet": 2
  }
}

const modeSets = [{
    "id": 1,
    "name": "Mode Set 1"
  },
  {
    "id": 2,
    "name": "Mode Set 2"
  }
]

function obtainModeSets(obj) {
  Object.entries(obj).forEach(([key, value]) => {
    if (key === "modeSet") {
      obj[key] = modeSets.find(set => set.id === value)
      return
    }

    if (typeof value === "object") {
      obtainModeSets(value)
    }
  })
}

obtainModeSets(obj)

console.log(obj)
zed5wv10

zed5wv102#

我想下面的代码可以解决你的问题,我不知道你的意思,但是根据这个例子,我想你需要用modeSets中提供的id替换你的key。

function obtainModeSets(obj, key, cb){
  // loop through all possible keys
  Object.keys(obj).forEach(k => {
    if (key === k) {
      obj[k] = cb(obj[k])
    }

    // if the value of the key is object, just go inside
    if (typeof obj[k] === "object") {
      obtainModeSets(obj[k], key, cb)
    }
  })
}

// you can call your function like this
obtainModeSets(obj, 'modeSet', (val) => {
  return modeSets.find(mode => mode.id === val)
})

相关问题