【问题标题】:.reduce in lodash fucntionality.reduce 的 lodash 功能
【发布时间】:2020-03-19 11:28:41
【问题描述】:

我试图弄清楚是否所有三个对象都在优化且更少的代码中定义。为此,我使用lodashreduce。但它没有给我正确的价值。我是否以错误的方式使用 reduce ?

checker1 = ((level1.test[testState.Id]['p1']['o1'] == undefined) && 
(level1.test[testState.Id]['p1']['o2'] == undefined) && 
(level1.test[testState.Id]['p1']['o3'] == undefined))
console.log('checker',checker1) //true


checker2 = _.reduce(level1.test[testState.Id] ,
                            (checker, val) => {return checker || (val == undefined)}, false)                  
console.log('checker',checker2) //false! It should be true!

【问题讨论】:

    标签: javascript reactjs lodash


    【解决方案1】:

    使用Array.every 会更容易(并且性能更高,因为它具有提前退出属性):

    const obj = level1.test[testState.Id].p1;
    const checker1 = ['o1', 'o2', 'o3'].every(key => obj[key] === undefined);
    

    【讨论】:

    • 谢谢@AKX 我们可以使用 lodash 吗?
    • Lodash 也有every,是的。
    • 那我们什么时候应该使用 .every 和 .reduce 呢?
    • 当你不想或不需要使用 Lodash 时?
    【解决方案2】:

    您对_.reduce 的输入只是level1.test[testState.Id],这似乎是一个非数组对象。该代码中没有任何内容告诉 _.reduce 它将适用于对象的 .p1.o1.p1.o2.p1.o3 属性。

    如果你想为此使用reduce,我会使用原生的并从一组属性名称开始:

    checker2 = ['o1', 'o2', 'o3'].reduce(
        (checker, prop) => checker && level1.test[testState.Id].p1 === undefined,
        false
    );
    

    ...在优化且更少的代码中

    reduce 不会做任何这些事情。它需要创建一个数组和多个函数调用。而是:

    const obj = level1.test[testState.id].p1;
    checker = obj.o1 === undefined && obj.o2 === undefined && obj.o3 === undefined;
    

    (如果您使用数组和回调,请将every 用作AKX points out。)

    【讨论】:

    • 感谢@T.J。克劳德!我们可以为此使用 lodash 吗?
    • @KnowledgeSeeker - 当然,只需将 ['o1', 'o2', 'o3'].reduce( 更改为 _.reduce(['o1', 'o2', 'o3'],。但是除了样式之外没有其他理由(而如果您使用原生表单,也许 JavaScript 引擎可以更好地优化它)。同样,要使用 AKX 的 every 答案,您可以使用 _.every([['o1', 'o2', 'o3'],
    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多