【问题标题】:javascript reduce function not running logicjavascript reduce函数没有运行逻辑
【发布时间】:2014-02-21 17:26:13
【问题描述】:

我正在编写一个函数,该函数将对输入进行一系列逻辑测试。我正在使用 lodash 库。因此,对于这个特定示例,如果 ID = 123ABCZ,它必须包含其中一项。

_.contains(list, obj.id) && _.contains(list, item)

我目前只有一个对象(在 item_arr 中),但有时我有很多,这就是为什么我有一个扁平的临时 obj。如果我传入 ['123ABCZ', 'apple'] 它应该返回 true,但事实并非如此。如果 ID 根本不存在,它也应该返回 true。我不知道逻辑哪里出错了!

function include_test(list){

    var item_arr = [{id: '123ABCZ', item: ['apple', 'pear', 'grape', 'lemon', 'lime']}];

    var functionizer = function(obj){
        var func_arr = _.map(obj.item, function(item){
            return function(){
                            if(_.contains(list, obj.id)
                    return _.contains(list, obj.id) && _.contains(list, item);
                            return true;
            };
        });
        return func_arr;
    };

    var temp = _.flatten(_.map(item_arr, function(item){
        return functionizer(item);
    }));

    var result = _.reduce(temp, function(acc, func){
        acc = acc || func();
        return acc;
    }, false);

    return result;
}

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    嗯,这里有几个问题。函数器实际返回的是什么?失去参数范围和引用变量的函数数组。你需要一个闭包……好几个。

    这是一个带有闭包的示例。

    function include_test(list){
    
        var item_arr = [{id: '123ABCZ', item: ['apple', 'pear', 'grape', 'lemon', 'lime']}];
    
        function functionizer(obj){
            var _obj = obj;
            return function() {
                _.map(_obj.item, function(item){
                    return (function(itemRef, listRef, objRef){
                               if(_.contains(listRef, objRef.id)
                                   return _.contains(listRef, objRef.id) && _.contains(listRef, itemRef);
                                   return true;
                           })(item, list, _obj);
                });
            }
        };
    
        var temp = _.flatten(_.map(item_arr, function(item){
            return functionizer(item);
        }));
    
        var result = _.reduce(temp, function(acc, func){
            acc = acc || func();
            return acc;
        }, false);
    
        return result;
    }
    

    【讨论】:

    • functionizer 返回一个函数数组。在我的示例中,它返回 _.contains(list, obj.id) && _.contains(list, item);对于项目的每次迭代。我只是得到'未定义;当我尝试运行您的示例时。
    • 您在示例中得到的结果是什么,错误或未定义或错误?
    • 我说错了,但现在有些东西正在工作......我认为 if(_.contains(list, obj.id)) 发生了一些事情。当我给它一个我知道包含的 obj.id 时,它永远不会进入 if 语句......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    相关资源
    最近更新 更多