如何在不创建未定义值的情况下使用lodash进行深度设置

时间:2015-10-19 06:28:21

标签: javascript lodash

使用lodash给出此示例:

var object = {};
_.set(object, [ 1, 2 ], 5);
console.log(object);

控制台中的结果对象是:

{
  1: [undefined, undefined, 5]
}

现在想象一下,而不是整数2,你设置的时间戳为1445231475.你现在在一个非常大的数组中有1445231474个未定义的值,在几次_.set操作后将耗尽内存。

如果可能_.set,如何创建此对象:

{
  1: {
    2: 5
  }
}

如果2真的是像“a”这样的字符串,那么Lodash可能会强制“2”进入多个未定义值的数组。

如有必要,我可以使用_.merge,但我对使用_.set功能感到更兴奋。

2 个答案:

答案 0 :(得分:4)

您可以使用lodash setWith

// unwanted behavior with set
let x = {}
_.set(x, [1,2], 'test')
// x = { '1': [ <2 empty items>, 'test' ] }

// desired behavior with setWith
let y = {}
_.setWith(y, [1,2], 'test', Object)
// y = { '1': { '2': 'test' } }

答案 1 :(得分:1)

显然,没有,这是不可能的,这就是原因:

_.set内,这是相关部分:

if (index == lastIndex) {
  nested[key] = value;
} else if (nested[key] == null) {
  nested[key] = isIndex(path[index + 1]) ? [] : {};
}

这里发生的是,只要路径项不作为键存在,就会测试它是否是有效索引(类型为number,或匹配/^\d+$/),如果是创建一个数组,否则创建一个对象。

由于key是一个字符串,目标是设置名为 2 (或任何其他数值)的属性,因此它将始终返回true来自isIndex并将生成一个数组。