【问题标题】:Replace property of a nested object by matching its key通过匹配其键替换嵌套对象的属性
【发布时间】:2020-01-22 09:46:31
【问题描述】:

我有以下类型的对象

let obj = {
    "p1" : "main",
    "p2" : {
        "p21" : [
            {
                "key1" : "val1",
                "value1" : "val2",
            },
            {
                "prop"  : "test",
                "value" : "dummy"
            }
        ]
    }
}

需要找到“prop”,如果存在则将“value”设置为空字符串。请注意,“p21”内可能有任意数量的对象,并且顺序不限。只需要找到“prop”,然后将“value”更新为空字符串

尝试了以下方法

obj.p2.p21.map((item) => {
    if (item.hasOwnProperty("prop")) {
      item.value = "";
    }
})

【问题讨论】:

  • 你的代码可以工作(虽然你不需要使用map,一个简单的forEach就足够了)。如果您的问题是存储在p21 中的对象不具有相同的结构,则问题可能是该对象的创建。
  • 同样的@Seblor,你的代码有什么错误?

标签: javascript ecmascript-6 ecmascript-5


【解决方案1】:

您需要创建一个函数来检查键,然后替换值。

let obj = {
  "p1": "main",
  "p2": {
    "p21": [{
        "key1": "val1",
        "value1": "val2",
      },
      {
        "prop": "test",
        "value": "dummy"
      }
    ]
  }
}

function replaceValue(item) {
  for (var i in item) {
    if (i == "prop") {
      item["value"] = "";
      break;//break if you only want to place the first , otherwise remove it
    }
  }
}

obj.p2.p21.map(item => replaceValue(item));

console.log(obj);
.as-console {
  height: 100% !important;
}

【讨论】:

    【解决方案2】:
    obj.p2.p21.map((elem) => {
        if(Object.keys(elem)[0] === "prop") 
            elem.value = ""
    })
    

    试试这样的?

    【讨论】:

    • @Hongrac 是的,但是对象值以相同的顺序序列化,除非您更改模型,否则没有理由更改它,在所有情况下,想法都在这里,最坏的情况,您可以使用另一张地图浏览 Object.keys(elem)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2022-10-14
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多