我需要在深层路径上创建一个空对象,但前提是它不存在并返回对该对象的引用。
可以使用_.has
,_.set
然后_.get
let path = 'some.deep.path';
if (!_.has(object, path)) {
_.set(object, path, {});
}
let descendant = _.get(object, path);
我想要的是避免重复object
,path
(或引入path
变量以避免重复path
值)
我想知道如果没有额外的功能/库,是否有办法做到这一点。
这包括处理数组/集合并接受_.property
iteratee / predicate简写的方法,即当一个字符串作为参数提供时,它会被传递给_.property
方法,该方法创建一个函数,它返回给定对象的路径上的值(由main函数给出,例如_.map
)。
阵列
集合
数学
对象
的Util
SEQ
链式方法,即在 seq 中调用的方法,例如:
_(value).chained().method().value();
答案 0 :(得分:3)
你可以避免使用_.has
:
var path = 'some.deep.path',
descendant = _.get(object, path);
if (!descendant) {
descendant = {};
_.set(object, path, descendant);
}
因此只遍历路径2次,而不是3次。
答案 1 :(得分:2)
在额外的lodash-deep库中有一个很好的_.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', {});
答案 2 :(得分:0)
这个怎么样:
function getDefault(obj, path, defaultValue) {
_.update(obj, path, d => d ? d : {})
return _.get(obj, path);
}
如果路径不存在则会创建,否则不会更改。
仍然不确定如何避免get
虽然..
答案 3 :(得分:0)
现在您可以使用_.setWith
setWith({}, "some.deep.path", value, Object);
返回
{some:{deep:{path:4}}