使用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
功能感到更兴奋。
答案 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
并将生成一个数组。