2016-03-15 2 views
0

Я не могу понять, почему я получаю undefined в моей консоли ...Почему я получаю неопределенное значение, если значение определено? используя eval()

Каждый объект, который повторяется, имеет определенное свойство.

Где я ошибся?

коллекция выглядит следующим образом:

var a = [ 
    { 
     city: 'Tucson', 
     state: 'AR', 
     zipcode: 85701 
    }, 
    { 
     city: 'Orlando', 
     state: 'FL', 
     zipcode: 32828 
    }, 
    { 
     city: 'Apopka', 
     state: 'FL', 
     zipcode: "32703", 
    }, 
    { 
     city: 'Compton', 
     state: 'CA', 
     zipcode: 90220 
    } 
]; 

вот функция:

function reduce(collection, condition){ 

    var map = []; 

    for (let v in collection){ 
     var cl = [], r, e, matches, m; 
     if ('string' === typeof condition) { 

      r = new RegExp(/([\w]+)\s*?(?=(>|<|>=|<=|==|===|!=|!==))/g); 

      matches = condition.match(r); 

      var nm = condition; 

      matches.forEach(function(m, index){ 
       // outputs state console.log(m); 
       nm = nm.replace(m, (collection[v][String(m)]) + ' '); 
       console.dir(collection[v]); 
       console.dir(m + " replaced by " + collection[v][m] + ", gets you: " + nm); 

      }); 
      cl.push(m); 

      //if (eval(condition) === true) { map.push(collection[v]); } 

     } else if ('object' === typeof condition){ 
      for (let c in condition){ 

       r = new RegExp("(" + collection[v][c] + ")*(>|<|>=|<=|==|===|!=|!==)", "g"); 

       e = condition[c]; 

       matches = condition[c].match(r); 

       if (0 < matches.length) { 
        matches.forEach(function(m, index){ 

         if (condition[c].indexOf(c) === -1) { 
          e = e.replace(m, ((typeof collection[v][c] === 'string') ? "'" + collection[v][c] + "'" : collection[v][c]) + " " + m); 
         } 
        }); 
       }; 
       cl.push(e); 
      } 


      if (eval(cl.join(" && ")) === true) { map.push(collection[v]); } 
     }; 

     console.log(cl.join(" && ")); 

    } 
    return map; 
} 

...

и вот вызов:

var floridians = reduce(a, "state == 'FL'");

Спасибо заранее, ребята!

+1

Я думаю, вы должны конкретно сказать, что кажется неопределенным. – Jonast92

+3

Просто вопрос, это их истинная причина, что вы * слишком усложняете вещь? Вы в основном переписываете Array.prototype.filter() – Cohars

+0

.... и переопределяете значение 'reduce', для которого существует' Array.prototype.reduce() ' – Jamiec

ответ

0

Причина, по которой вы получаете undefined, состоит в том, что ваша переменная m (которая, по вашему мнению, содержит строку «состояние») имеет конечное пространство. При использовании в квадратных скобках для чтения свойства вашего объекта это возвращает undefined.

Это было обнаружено с использованием хорошей отлаженной отладки: https://jsfiddle.net/wLs3o9mk/ - Ваше использование console.dir маскировало проблему, похоже, что она сбрасывает несколько пробелов (например, HTML). Это стало довольно очевидным при переходе на console.log, которого нет.