如何使用一个内衬递归地向Javascript数组添加属性?

时间:2019-05-13 15:30:50

标签: javascript

我想向尚未分配的Javascript对象添加特定属性,该属性是父对象的一部分。通常我会执行以下操作:

let obj = {};

if(!obj["property"])
{
    obj["property"] = {};
}

obj["property"]["property2"] = value;

上面的代码可以用一个衬里编写并且在if语句中没有对象分配吗?

要与Linux比较,我想使用类似于mkdir -p ./a/b而不是mkdir a的东西。 cd a; mkdir b。

谢谢。

4 个答案:

答案 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>