我需要在深路径上创建一个空对象,但前提是它不存在并返回对该对象的引用。
这可以通过使用来完成_.has,_.set然后_.get
let path = 'some.deep.path';
if (!_.has(object, path)) {
_.set(object, path, {});
}
let descendant = _.get(object, path);
Run Code Online (Sandbox Code Playgroud)
我想要的是避免重复object, path(或引入path变量以避免重复path值)
我想知道是否有办法在没有额外功能/库的情况下做到这一点。
这包括处理数组/集合并接受_.propertyiteratee/predicate 速记的方法,即当一个字符串作为参数提供时,它被传递给_.property创建一个函数的方法,该函数返回给定对象的路径处的值(即由主函数给出,例如_.map)。
大批
收藏
数学
目的
实用程序
序列
链式方法,被称为一个方法,即以次uence,如:
_(value).chained().method().value();
Run Code Online (Sandbox Code Playgroud)
_.deepDefault额外的lodash-deep库中有一个方法,可以检查 处的值是否propertyPath解析为,如果是这种情况,undefined则将其设置为:defaultValue
var descendant = _.deepDefault(object, 'some.deep.path', {});
Run Code Online (Sandbox Code Playgroud)
该库不再更新,因为 Lodash 现在原生支持大部分功能,因此这里有一个 lodash mixin 函数的实现:
function getOrSetDefault(object, path, defaultValue) {
const descendant = _.get(object, path);
if (descendant === undefined) {
_.set(object, path, defaultValue);
}
return descendant;
}
_.mixin({ getOrSetDefault });
const a = _.getOrSetDefault(object, 'some.deep.path', 42);
const b = _.getOrSetDefault(object, 'some.other.deep.path', {});
b.c = 42;
Run Code Online (Sandbox Code Playgroud)
有了新的可选链接运算符和逻辑空值赋值,就不需要在这种特殊情况下使用 lodash(如果可以接受使用some.deep.path默认值填充/定义),例如:
some?.deep?.path ??= {}
const { foo } = some.deep.path
Run Code Online (Sandbox Code Playgroud)
不幸的是,可选的链接分配尚不可用。请参阅/sf/answers/4121748501/
只有一个缺点,即需要重复属性访问器 ( some.deep.path) 来检索值。然而,在这种情况下,我们将使用 Typescript/JSDoc 进行自动补全,这与 lodash 函数的路径参数(字符串或数组)不同
如果只需要在路径上获取值,香草try/catch就足够了:
let foo: Foo;
try {
foo = some.deep.path.foo
} catch {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5876 次 |
| 最近记录: |