是否可以向Typescript中的嵌套对象动态添加属性?因为我的对象是动态的。在一种情况下,我有obj。
[
{someObject},
{
prop1:1,
columns: [
components: [
columns: [
components:[
{
type: number,
key: 'key1'
},
{
type: textfield,
key: 'key2'
}
]
]
]
]
}
]
例如,对于键为key2的对象,我需要添加一些标志。在另一种情况下,我得到的对象较少嵌套。是否存在任何用于此操作的例如lodash函数,或者我必须通过递归来迭代此对象?
答案 0 :(得分:1)
您将必须递归搜索。幸运的是,这并不是很难实现:
const findAndUpdate = ($obj, $key, $val) => {
Object.keys($obj).includes($key) ?
$obj[$key] = $val
: Object.values($obj).forEach($nestedObj => findAndUpdate($nestedObj, $key, $val));
return $obj;
}
我使用Object.<method>
而不是lodash方法,以便可以轻松地在各种环境中复制该方法。此函数将接收一个初始对象,您要更新的密钥以及您要将其更新到的值。
用法:
const foo = {
b: {
c: {
d: 5
}
}
}
findAndUpdate(foo, "d", 56);
console.log(foo) // -> { b: { c: { d: 56 } } } }
它检查键是否在对象的当前层中。如果不是,那么我们再次为当前层中的每个对象调用该函数-传入原始对象作为参考。如果它确实在当前层中找到了一个键,那么它将更新参考所指向的对象。最终,在清除堆栈之后,我们将返回原始的更新对象。显然,如果找不到与最初传入的目标密钥匹配的密钥,则该对象将保持不变。
如果您想进行更多自定义,则可以更改$ val以使用$ func函数:
const findAndUpdate = ($obj, $key, $func) => {
Object.keys($obj).includes($key) ?
$obj[$key] = $func($obj[$key])
: Object.values($obj).forEach($nestedObj => findAndUpdate($nestedObj, $key, $val));
return $obj;
}
然后您可以执行以下操作:
findAndUpdate(foo, "d", old => old+1 );
console.log(foo) // -> { b: { c: { d: 6 } } } }