2014-02-21 4 views
1

Я пишу функцию, которая будет делать серию логических тестов на входе. Я использую библиотеку lodash. Поэтому для этого конкретного примера, если есть ID = 123ABCZ, он должен содержать один из элементов.javascript функция уменьшения не работает логика

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

У меня есть только один объект в настоящее время (в item_arr) там, но иногда у меня много, поэтому я есть временный OBJ, который сведен. если я перейду в ['123ABCZ', 'apple'], он должен вернуть true, но это не так. Он также должен возвращать 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; 
} 

ответ

0

Ну, здесь есть пара вопросов. Что фактически возвращает функционалист? Массив функций, которые потеряли объем своих аргументов и их ссылочных переменных. Вам нужно закрыть ... ну некоторые из них.

Вот пример с закрытием.

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; 
} 
+0

Функционалист возвращает массив функций. в моем примере он возвращает _.contains (list, obj.id) && _.contains (list, item); для каждой итерации предметов. Я только получаю «неопределенный; когда я пытаюсь запустить ваш пример. – TorusTorus

+0

Каков результат, который вы получаете в своем примере: false или undefined или error? – pwnyexpress

+0

Я получал ложь, но сейчас что-то вроде работает ... Я думаю, что что-то происходит с if (_. Contains (list, obj.id)). Когда я вхожу в объект obj.id, который я знаю, он никогда не входит в оператор if ... – TorusTorus