2015-10-19 51 views
3

考虑这个例子:如何使用lodash深套,而无需创建不定值

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

在控制台中得到的对象是:

{ 
    1: [undefined, undefined, 5] 
} 

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

如果可能的_.set,如何将一个去创造这个对象:

{ 
    1: { 
    2: 5 
    } 
} 

这是可能的,如果2确实是一个字符串,如“一”,但Lodash将迫使甚至是“2”到多个未定义值的数组。

如果需要,我可以使用_.merge,但是使用_.set能力我会更加兴奋。

回答

2

显然,没有,这是不可能做到这一点,这里的原因:

_.set,这是相关部分:

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

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

key由于是一个字符串,并且目标是设置名为(或任何其他数值)一个属性,则总是从isIndex在数组返回true,并且将结果。

+1

谢谢@Amit,很好的描述'为什么不'。我现在可以选择使用与_.set类似的属性的自定义混搭,或者_.merge,这可能是我要去的方式。干杯! – ryanm

+0

@ryanm,你能详细说明一下吗?我遇到了类似的问题,并希望避免_.set的这个“特征”。 – Sigfried

+0

@Sigfried我不在这个Q&A的思维空间中,但我会尽力帮忙。我认为这个关键是使用一个字符串来代替'3',或者使用一个数组(lodash集合)。还有一个定制设置,可以覆盖您的自定义需求:https://lodash.com/docs/4.15.0#setWith希望有所帮助! – ryanm