使用 lodash 在深路径创建一个空对象

Ste*_*kiy 5 javascript lodash

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

这可以通过使用来完成_.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值)

我想知道是否有办法在没有额外功能/库的情况下做到这一点。


接受或处理路径的 lodash 方法列表。按字母顺序

这包括处理数组/集合并接受_.propertyiteratee/predicate 速记的方法,即当一个字符串作为参数提供时,它被传递给_.property创建一个函数的方法,该函数返回给定对象的路径处的值(即由主函数给出,例如_.map)。

大批

收藏

  • v0.5.0 _.countBy(集合,[iteratee=_.identity])
  • v0.1.0 _.every(集合,[谓词=_.identity])
  • v0.1.0 _.filter(集合,[谓词=_.identity])
  • v0.1.0 _.find(集合,[谓词=_.identity])
  • v0.1.0 _.groupBy(集合,[iteratee=_.identity])
  • v4.0.0 _.invokeMap (collection, path, [args])
  • v0.1.0 _.map(集合,[iteratee=_.identity])
  • v3.0.0 _.partition(集合,[谓词=_.identity])
  • v0.1.0 _.reject(集合,[iteratee=_.identity])
  • v0.1.0 _.some(集合,[iteratee=_.identity])

数学

  • v4.0.0 _.maxBy (array, [iteratee=_.identity])
  • v4.7.0 _.meanBy (array, [iteratee=_.identity])
  • v4.0.0 _.minBy (array, [iteratee=_.identity])
  • v4.0.0 _.sumBy (array, [iteratee=_.identity])

目的

  • v1.0.0 _.at(对象,[路径])
  • v1.1.0 _.findKey (object, [predicate=_.identity])
  • V2.0.0 _.findLastKey(对象,[谓词= _。身份])
  • v3.7.0 _.get (object, path, [defaultValue])
  • v0.1.0 _.has(对象,路径)
  • v4.0.0 _.hasIn(对象,路径)
  • v4.0.0 _.invoke (object, path, [args])
  • v2.4.0 _.mapValues (object, [iteratee=_.identity])
  • v0.1.0 _.omit(对象,[路径])
  • v0.1.0 _.pick(对象,[路径])
  • v0.1.0 _.result(对象,路径,[defaultValue])
  • v3.7.0 _.set(对象、路径、值)
  • v4.0.0 _.setWith (object, path, value, [customizer])
  • v4.0.0 _.unset(对象,路径)
  • v4.6.0 _.update(对象、路径、更新程序)
  • v4.6.0 _.updateWith (object, path, updater, [customizer])

实用程序

序列

链式方法,被称为一个方法,即以次uence,如:

_(value).chained().method().value();
Run Code Online (Sandbox Code Playgroud)

Ste*_*kiy 3

_.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)