2015-02-19 3 views
15

В некоторых ситуациях может случиться так, что у нас есть undefined или вообще falsy значения в структурах массива. Например, при чтении и заполнении данных из некоторых неизвестных источников, таких как базы данных или структуры HTML. КакУдаление неопределенных значений из массива

var data = [42, 21, undefined, 50, 40, undefined, 9] 

Так что может вызвать проблемы при зацикливании над такими массивами и работать над элементами, что является лучшей практикой для удаления undefined (falsy значения)?

+0

Как об этом http://jsfiddle.net/5uuyoo5t/? –

ответ

41

Использовать Array.prototype.filter здесь может быть очевидным. Таким образом, чтобы удалить только неопределенные значения мы могли бы назвать

var data = [42, 21, undefined, 50, 40, undefined, 9]; 

data = data.filter(function(element) { 
    return element !== undefined; 
}); 

Если мы хотим, чтобы отфильтровать все falsy значения (например, 0 или нуль), мы можем использовать вместо return !!element;.

Но мы можем сделать это slighty более элегантный, по проездом функции Boolean конструктора, соответственно функцию Number конструктора для .filter:

data = data.filter(Number); 

Что бы сделать работу в этом случае, чтобы вообще удалить любой falsy значение, мы назвали бы

data = data.filter(Boolean); 

S ince Boolean() конструктор возвращает true по правным значениям и false на любые falsy значение, это очень опрятный вариант.

+2

Просто отметьте, что 'filter (Number)' также удалит '0'. – Lewis

+0

это также удалит значения false, такие как 'false', которые могут существовать в массиве – lfender6445

1
var a = ["3","", "6"]; 
var b = [23,54,56]; 
var result = []; 

for (var i=0;i<a.length;++i) { 
    if (a[i] != "") { 
     result[i] = b[i]; 
    } 
} 

result = result.filter(function(element) { 
    return element !== undefined; 
}); 

console.log(result); 
0

Array.prototype.reduce() может быть использован для удаления элементов от состояния из массива, но с дополнительным преобразованием элементов, если требуется, в одной итерации.


Удалить undefined значения из массива, с поддержкой вложенных массивов.

function transform(arr) { 
    return arr.reduce((memo, item) => { 
     if (typeof item !== "undefined") { 
      if (Array.isArray(item)) item = transform(item); 
      // We can transform item here. 
      memo.push(item); 
     } 
     return memo; 
    }, []); 
} 

let test1 = [1, 2, "b", 0, {}, "", , " ", NaN, 3, undefined, null, 5, false, true, [1, true, 2, , undefined, 3, false, ''], 10]; 

console.log(transform(test1)); 

Попробуйте на jsfiddle.net/bjoy4bcc/

12

Inline с использованием лямбда

result.filter(item => item); 
+0

, и этот элемент удалит все значения false. Поскольку ОП указывает ложные значения, которые являются нежелательными, это, безусловно, лучший ответ IMO. Тем не менее, твой также конкретно указывает на неопределенное, в какой момент вам нужно будет 'result.filter (item => item! == undefined)' –

+0

Мне это нравится ... работает как магия – undefined

Смежные вопросы