我想向尚未分配的Javascript对象添加特定属性,该属性是父对象的一部分。通常我会执行以下操作:
let obj = {};
if(!obj["property"])
{
obj["property"] = {};
}
obj["property"]["property2"] = value;
上面的代码可以用一个衬里编写并且在if语句中没有对象分配吗?
要与Linux比较,我想使用类似于mkdir -p ./a/b而不是mkdir a的东西。 cd a; mkdir b。
谢谢。
答案 0 :(得分:9)
是的,您可以这样做:
let obj = {};
(obj["property"] = obj["property"] || {})["property2"] = "value";
console.log(obj);
它利用||
运算符来检查虚假值,因此只有在检查对象或某些始终为真的值时才能可靠地工作。
然后利用=
运算符返回分配的值这一事实。由于它是一个对象,而JS中的对象是引用类型,因此您可以为其分配属性,它将使先前分配的对象发生变化。
但是,这很丑。我认为不应过多地强调编写“一个班轮”代码。
答案 1 :(得分:1)
您可以减少给定的键并在最后一步分配值。
这适用于任意数量的键。
["property", "property2"]
.reduce((o, k, i, { length }) => o[k] = o[k] || (i + 1 === length ? value : {}), obj);
答案 2 :(得分:1)
ziggy wiggy解决方案将起作用。
或者,虽然您也可以做obj = {...obj, property: {...obj.property, property2: value}};
这实际上要慢一些,因为它会创建一个新对象,然后将其分配给obj,但最好如果您要保持obj
不变,在这种情况下,只需将结果分配给一个新变量。 (const obj2 ={...obj, property: {...obj.property, property2: value}};
)
答案 3 :(得分:0)
其他答案也不错,但也可以使用lodash的set
:
const { set } = _; // import { set } from "lodash";
let obj = {};
set(obj, "property.property2", "value");
console.log(obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>