Подтвердить что ты не робот

Почему функция отображения javascript возвращает undefined?

Мой код

 var arr = ['a','b',1];
 var results = arr.map(function(item){
                if(typeof item ==='string'){return item;}  
               });

Это дает следующие результаты:

["a","b",undefined]

Я не хочу undefined в массиве результатов. Как я могу это сделать?

4b9b3361

Ответ 1

Вы ничего не возвращаете в том случае, если элемент не является строкой. В этом случае функция возвращает undefined, что вы видите в результате.

Функция map используется для отображения одного значения в другое, но похоже, что вы действительно хотите фильтровать массив, который не подходит для функции карты.

На самом деле вы хотите filter. Он принимает функцию, которая возвращает true или false в зависимости от того, хотите ли вы элемент в результирующем массиве или нет.

var arr = ['a','b',1];
var results = arr.filter(function(item){
    return typeof item ==='string';  
});

Ответ 2

Так как ES6 filter поддерживает нотную стрелку (например, LINQ):

Таким образом, он может быть сведен к следующему одностроку.

['a','b',1].filter(item => typeof item ==='string');

Ответ 3

Фильтр работает для этого конкретного случая, когда элементы не изменены. Но во многих случаях, когда вы используете карту, вы хотите внести некоторые изменения в переданные элементы.

если это ваше намерение, вы можете использовать уменьшить:

var arr = ['a','b',1];
var results = arr.reduce((results, item) => {
    if (typeof item === 'string') results.push(modify(item)) // modify is a fictitious function that would apply some change to the items in the array
    return results
}, [])

Ответ 4

Вы возвращаете только значение, если текущий элемент является string. Возможно, достаточно указать пустую строку:

var arr = ['a','b',1];
var results = arr.map(function(item){
    return (typeof item ==='string') ? item : '';  
});

Конечно, если вы хотите отфильтровать любые нестроковые элементы, вы не должны использовать map(). Скорее, вы должны изучить функцию filter().

Ответ 5

Мое решение было бы использовать фильтр после карты.

Это должно поддерживать каждый тип данных JS.

Пример:

const notUndefined = anyValue => typeof anyValue !== 'undefined'    
const noUndefinedList = someList
          .map(// mapping condition)
          .filter(notUndefined); // by doing this, 
                      //you can ensure what returned is not undefined

Ответ 6

var arr = ['a','b',1];
 var results = arr.filter(function(item){
                if(typeof item ==='string'){return item;}  
               });

Ответ 7

Вы можете реализовать как приведенную ниже логику. Предположим, вам нужен массив значений.

let test = [ {name:'test',lastname:'kumar',age:30},
             {name:'test',lastname:'kumar',age:30},
             {name:'test3',lastname:'kumar',age:47},
             {name:'test',lastname:'kumar',age:28},
             {name:'test4',lastname:'kumar',age:30},
             {name:'test',lastname:'kumar',age:29}]

let result1 = test.map(element => 
              { 
                 if (element.age === 30) 
                 {
                    return element.lastname;
                 }
              }).filter(notUndefined => notUndefined !== undefined);

output : ['kumar','kumar','kumar']