繁体   English   中英

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

[英]JS: Check for existence of deep object key and replace value

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

例如

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" }

有没有人有什么建议? 谢谢

你可以像这样使用递归

 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)

我认为类似下面的代码可能会解决您的问题。 我不知道你到底是什么意思。 但是根据显示的例子,我猜你需要用modeSets中提供的 id 替换你的密钥。

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)
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM