Почему функция отображения javascript возвращает undefined?
Мой код
var arr = ['a','b',1];
var results = arr.map(function(item){
if(typeof item ==='string'){return item;}
});
Это дает следующие результаты:
["a","b",undefined]
Я не хочу undefined в массиве результатов. Как я могу это сделать?
Ответы
Ответ 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']