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

Javascript 如何在不创建未定义值的情况下使用lodash进行深度设置,javascript,lodash,Javascript,Lodash,给出以下示例: 控制台中的结果对象是: { 1: [undefined, undefined, 5] } 现在想象一下,您将时间戳设置为1445231475,而不是整数2。现在,在一个非常大的数组中有1445231474个未定义的值,该数组在执行几次.set操作后将耗尽内存 如果可能的话,使用\uuu.set,如何创建此对象: { 1: { 2: 5 } } 如果2真的是像“a”一样的字符串,这是可能的,但Lodash甚至会将“2”强制放入多个未定义值的数组中 如果需要,

给出以下示例:

控制台中的结果对象是:

{
  1: [undefined, undefined, 5]
}
现在想象一下,您将时间戳设置为1445231475,而不是整数2。现在,在一个非常大的数组中有1445231474个未定义的值,该数组在执行几次
.set
操作后将耗尽内存

如果可能的话,使用
\uuu.set
,如何创建此对象:

{
  1: {
    2: 5
  }
}
如果2真的是像“a”一样的字符串,这是可能的,但Lodash甚至会将“2”强制放入多个未定义值的数组中


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

显然,,这是不可能的,原因如下:

其中,这是相关部分:

if (index == lastIndex) {
  nested[key] = value;
} else if (nested[key] == null) {
  nested[key] = isIndex(path[index + 1]) ? [] : {};
}
这里发生的事情是,只要路径项不作为键存在,就会测试它是否是有效索引(类型为
number
,或匹配
/^\d+$/
),如果是,则创建一个数组,否则创建一个对象


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

可以使用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' } }
//集合中不需要的行为
设x={}
_.set(x[1,2],“测试”)
//x={'1':[,'test']}
//setWith的期望行为
设y={}
_.setWith(y[1,2],'test',Object)
//y={'1':{'2':'test'}

谢谢@Amit,对“为什么不”的精彩描述。现在,我有了一个自定义mixin选项,该选项具有与u.set或u.merge类似的属性,这可能就是我要做的。干杯@瑞安,你能详细说明一下吗?我遇到了一个类似的问题,希望避免使用u.set的这个“功能”。@Sigfried我不在本问答的范围之内,但我会尽力帮助你。我认为这一点的关键是使用字符串作为键
“3”
,而不是
3
,或者使用数组(lodash集合)。还有一个自定义设置,您可以覆盖,以帮助您的自定义需要:希望有帮助!谢谢使用字符串不起作用,但是setWith起作用:
.set({},'foo.5',true)
产生
{“foo”:[null,null,null,null,true]}
,这不好,但是
.setWith({},'foo.5',true,Object)
产生
{“foo”:{“5”:true}
// 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' } }