Javascript 使用lodash在深路径处创建空对象

Javascript 使用lodash在深路径处创建空对象,javascript,lodash,Javascript,Lodash,我需要在深路径上创建一个空对象,但前提是它不存在,并返回对该对象的引用 这可以通过使用.has,.set然后使用.get let path = 'some.deep.path'; if (!_.has(object, path)) { _.set(object, path, {}); } let descendant = _.get(object, path); 相反,我希望避免重复对象,路径(或者引入路径变量以避免重复路径值) 我想知道是否有一种不用额外函数/库就可以做到这一点的

我需要在深路径上创建一个空对象,但前提是它不存在,并返回对该对象的引用

这可以通过使用
.has
.set
然后使用
.get

let path = 'some.deep.path';

if (!_.has(object, path)) {
    _.set(object, path, {});
}

let descendant = _.get(object, path);
相反,我希望避免重复
对象
路径
(或者引入
路径
变量以避免重复
路径
值)

我想知道是否有一种不用额外函数/库就可以做到这一点的方法


接受或处理路径的lodash方法的列表。按字母顺序 这包括处理数组/集合并接受
.property
迭代对象/谓词速记的方法,即当字符串作为参数提供时,它被传递给
.property
方法,该方法创建一个函数,返回给定对象路径上的值(这是由主函数给出的,例如,
\uuu.map

阵列

  • v4.0.0(数组,[value],[iteratee=\uu0.identity])
  • v3.0.0(数组,[predicate=..identity])
  • v3.0.0(数组,[predicate=..identity])
  • v1.1.0(数组,[predicate=..identity],[fromIndex=0])
  • v2.0.0(数组,[predicate=551;.identity],[fromIndex=array.length-1])
  • v4.0.0([arrays],[iteratee=\u0.identity])
  • v4.0.0(数组,值,[iteratee=..identity])
  • v4.0.0(数组,值,[iteratee=..identity])
  • v3.0.0(数组,[predicate=..identity])
  • v3.0.0(数组,[predicate=..identity])
  • v4.0.0([arrays],[iteratee=\u0.identity])
  • v4.0.0(数组,[iteratee=..identity])
  • v4.0.0([arrays],[iteratee=\u0.identity])
  • v4.1.0([props=[]],[values=[]])
收藏

  • v0.5.0(集合,[iteratee=u2;.identity])
  • v0.1.0(集合,[predicate=.[identity])
  • v0.1.0(集合,[predicate=.[identity])
  • v0.1.0(集合,[predicate=.[identity])
  • v0.1.0(集合,[iteratee=u2;.identity])
  • v4.0.0(集合,路径,[args])
  • v0.1.0(集合,[iteratee=u2;.identity])
  • v3.0.0(集合,[predicate=\u0.identity])
  • v0.1.0(集合,[iteratee=u2;.identity])
  • v0.1.0(集合,[iteratee=u2;.identity])
数学

  • v4.0.0(数组,[iteratee=..identity])
  • v4.7.0(数组,[iteratee=..identity])
  • v4.0.0(数组,[iteratee=..identity])
  • v4.0.0(数组,[iteratee=..identity])
对象

  • v1.0.0(对象,[路径])
  • v1.1.0(对象,[谓词=\标识])
  • v2.0.0(对象,[predicate=.\ux.identity])
  • v3.7.0(对象、路径,[defaultValue])
  • v0.1.0(对象、路径)
  • v4.0.0(对象、路径)
  • v4.0.0(对象、路径、[args])
  • v2.4.0(对象,[iteratee=u2;.identity])
  • v0.1.0(对象,[路径])
  • v0.1.0(对象,[路径])
  • v0.1.0(对象,路径,[defaultValue])
  • v3.7.0(对象、路径、值)
  • v4.0.0(对象、路径、值,[自定义程序])
  • v4.0.0(对象、路径)
  • v4.6.0(对象、路径、更新程序)
  • v4.6.0(对象、路径、更新程序[自定义程序])
Util

  • v4.0.0([func=..identity])
  • v3.2.0(路径、值)
  • v3.7.0(路径,[args])
  • v3.7.0(对象,[args])
  • v2.4.0(路径)
  • v3.0.0(对象)
  • v4.0.0(值)
Seq

链式方法,即在序列中调用的方法,例如:

_(value).chained().method().value();
  • v1.0.0([路径])

在一个额外的库中有一个很好的
方法。deepDefault
方法返回一个引用:

var descendant = _.deepDefault(object, 'some.deep.path', {});
添加自定义lodash mixin函数:

function getDefault(object, path, defaultValue) {
    var descendant = _.get(object, path);
    if (typeof descendant === 'undefined') {
        _.set(object, path, defaultValue);
    }
    return descendant;
}

_.mixin({ 'getDefault': getDefault });

_.getDefault(object, '.some.deep.path', {});

您可以通过以下方法避免出现
\uhas

var path = 'some.deep.path',
descendant = _.get(object, path);
if (!descendant) {
    descendant = {};
    _.set(object, path, descendant);
}
因此,只需遍历路径2次,而不是3次。

这样如何:

function getDefault(obj, path, defaultValue) {
  _.update(obj, path, d => d ? d : {})
  return _.get(obj, path);
}
如果路径不存在,它将被创建,否则不会更改。
仍然不确定如何避免使用get。

现在您可以使用u.setWith

setWith({}, "some.deep.path", value, Object);
返回

{some:{deep:{path:4}}

如果路径包含数字键,则不起作用:var path='some.22.11'