В приведенном ниже коде я создал функцию обратного вызова fn для возврата values < 2 после того, как цикл в функции map пройдет через массив, переданный в качестве параметра. Но консоль регистрирует массив логических значений вместо значений

Что я делаю не так?

 var newarr = []

function fn(val){
  return val < 3;
}

function map(arr){
  for (var i = 0; i < arr.length; i++){
    newarr.push(fn(arr[i]));
  }
  console.log(newarr);
}

map ([1,2,3,4,5,6], fn);

Мой результат

[ true, true, false, false, false, false ]
1
ogbeh 29 Авг 2017 в 12:15

4 ответа

Лучший ответ

Это потому, что результат fn является логическим:

return val < 3; // true or false

Если вам нужно фильтровать элементы, то логика должна немного отличаться, и имя должно быть filter, а не map:

var newarr = [];

function fn(val) {
  return val < 3;
}

function filter(arr) {
  for (var i = 0; i < arr.length; i++) {
    if (fn(arr[i])) {
      newarr.push(arr[i]);
    }
  }
  console.log(newarr);
}

Также ES6 изначально поддерживает функцию Array#filter:

let newArray = arr.filter(item => item < 3);
1
alexmac 29 Авг 2017 в 09:23

Исправление в вашем коде:

var newarr = []

function fn(val){
  return val < 3;
}

function map(arr){
  for (var i = 0; i < arr.length; i++){
if(fn(arr[i]))
      newarr.push(arr[i]);
  }
  console.log(newarr);
}

map ([1,2,3,4,5,6], fn);

И код ES6 для того же решения

var newarr = [1,2,3,4,5,6].filter(function(item){
return item<3;
})
console.log(newarr);
1
Nemani 29 Авг 2017 в 09:23

Вы должны использовать Array.prototype.filter с вашим обратным вызовом для ваших целей.

0
y_vyshnevska 29 Авг 2017 в 09:21