gpt4 book ai didi

javascript - 如何替换JS对象中动态指定的属性

转载 作者:行者123 更新时间:2023-11-29 21:13:55 26 4
gpt4 key购买 nike

根据条件动态选择属性(或嵌套对象)。它可以是以下 4 种可能性之一:

var tempData = o.title ? o["properties"] || o["items"]["properties"] : o[k]["properties"] || o[k]["items"]["properties"];

然后我得到这个新数据,我想替换上面选择的。

var newData = //some new Object

我想用新数据替换上面选择的任何内容。我可以执行以下操作(再次检查条件并设置新数据):

        if(o.title){
if (o["properties"]) {
o["properties"] = newData;
} else if (o["items"]["properties"]) {
o["items"]["properties"] = newData;
}
}else{
if (o[k]["properties"]) {
o[k]["properties"] = newData;
} else if (o[k]["items"]["properties"]) {
o[k]["items"]["properties"] = newData;
}
}

但是看起来不太好。实现此目标的更复杂方法是​​什么?

最佳答案

目前尚不清楚您是否一般尝试用 newData 替换任何 properties 属性,或者您是否希望它专门成为您指定的属性之一在你的代码中。我假设您只想替换您在代码中特别显示的那些。

注意:以下假定 properties 属性的值不可能计算为 false。如果它可能有一个计算结果为 false 的值,这将失败。

作为第一步,我会做类似的事情:

var p;
if (o.title) {
p=o;
} else {
p=o[k];
}
if (p.properties) {
p.properties = newData;
} else if (p.items.properties) {
p.items.properties = newData;
}

但是,这依赖于:

  • o 不是 nullundefined
  • 如果您尝试测试 o.title 是否存在,
  • o.title 不会计算为 false
  • k 有效/已定义。
  • p(即 o[k])不是 null 或未定义(即是一个对象)
  • p.properties 不会评估为 false,如果您正在测试是否存在
  • p.items 不是 null 或未定义(即是一个对象)
  • p.items.properties 不会评估为 false,如果您正在测试是否存在

一个更健壮的实现是:

if (typeof o === 'object' && o !== null) {
var p;
if (o.hasOwnProperty('title')) {
p = o;
} else {
p = o[k];
}
if (typeof p === 'object' && p !== null) {
if (p.hasOwnProperty('properties')) {
p.properties = newData;
} else if (typeof p.items === 'object' && p.items !== null
&& p.items.hasOwnProperty('properties')) {
p.items.properties = newData;
}
}
}

这仍然依赖于:

  • k 有效/已定义。

基本上,如果您知道的话,可以使用if(o.title) 之类的快捷方式来测试是否存在

  1. o 的可能值不能包括可能使您的代码抛出错误的值(例如 onull未定义), 和
  2. 当属性实际存在时,o.title 的可能值不会计算为 false(例如 o.titlenullundefined(是的,该属性可以存在,但值为 undefined),false0 ''等)。

如果您打算在代码的其他区域执行替换,或者如果您打算使用除硬编码 itemsproperties 之外的属性键,那么你应该创建一个函数。假设您在代码的这一部分执行此替换,使用变量来保存您要在其中查找properties 的对象比创建一个更快/更有效功能。

关于javascript - 如何替换JS对象中动态指定的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40373240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com