Удаление пустых элементов из массива в Javascript
Как удалить пустые элементы из массива в JavaScript?
есть ли простой способ, или мне нужно перебрать и удалить их вручную?
30 ответов
Я использую этот метод, расширяя прототип собственного массива:
Array.prototype.clean = function(deleteValue) {
for (var i = 0; i < this.length; i++) {
if (this[i] == deleteValue) {
this.splice(i, 1);
i--;
}
}
return this;
};
test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);
или вы можете просто нажать существующие элементы в другой массив:
// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
var newArray = new Array();
for (var i = 0; i < actual.length; i++) {
if (actual[i]) {
newArray.push(actual[i]);
}
}
return newArray;
}
cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);
простые способы:
var arr = [1,2,,3,,-3,null,,0,,undefined,4,,4,,5,,6,,,,];
arr.filter(n => n)
// [1, 2, 3, -3, 4, 4, 5, 6]
arr.filter(Number)
// [1, 2, 3, -3, 4, 4, 5, 6]
arr.filter(Boolean)
// [1, 2, 3, -3, 4, 4, 5, 6]
или - (только для один элементы массива типа "текст")
['','1','2',3,,'4',,undefined,,,'5'].join('').split('');
// output: ["1","2","3","4","5"]
или-классический способ: простая итерация
var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
len = arr.length, i;
for(i = 0; i < len; i++ )
arr[i] && arr.push(arr[i]); // copy non-empty values to the end of the array
arr.splice(0 , len); // cut the array and leave only the non-empty values
arr // [1,2,3,3,[],Object{},5,6]
через jQuery:
var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];
arr = $.grep(arr,function(n){ return n == 0 || n });
arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]
обновление-еще один быстрый, крутой способ (с помощью ES6):
var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,],
temp = [];
for(let i of arr)
i && temp.push(i); // copy each non-empty value to the 'temp' array
arr = temp;
delete temp; // discard the variable
arr // [1, 2, 3, 3, 4, 4, 5, 6]
удалить пустые значения
['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)
// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]
Если вам нужно удалить все пустые значения ( "" , null, undefined и 0):
arr = arr.filter(function(e){return e});
удалить пустые значения и разрывы строк:
arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});
пример:
arr = ["hello",0,"",null,undefined,1,100," "]
arr.filter(function(e){return e});
вернуться:
["hello", 1, 100, " "]
обновление (на основе комментария Алнитака)
в некоторых ситуациях вы можете сохранить " 0 "в массиве и удалить что-либо еще (null, undefined и""), это один из способов:
arr.filter(function(e){ return e === 0 || e });
вернуться:
["hello", 0, 1, 100, " "]
просто один лайнер:
[1, false, "", undefined, 2].filter(Boolean); // [1, 2]
или с помощью underscorejs.org:
_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]
если у вас есть Javascript 1.6 или более поздней версии, вы можете использовать Array.filter
С помощью тривиальных return true
функция обратного вызова, например:
arr = arr.filter(function() { return true; });
С .filter
автоматически пропускает отсутствующие элементы в исходном массиве.
страница MDN, связанная выше, также содержит хорошую версию проверки ошибок filter
Это можно использовать в интерпретаторах JavaScript, которые не поддерживают официальную версию.
обратите внимание, что это не будет удалить null
записи ни записи с явным undefined
значение, но OP специально запросил" отсутствующие " записи.
чистый способ сделать это.
var arr = [0,1,2,"Thomas","false",false,true,null,3,4,undefined,5,"end"];
arr = arr.filter(Boolean);
// [1, 2, "Thomas", "false", true, 3, 4, 5, "end"]
для удаления отверстий, вы должны использовать
arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this
для удаления отверстия и, falsy (null, undefined, 0, -0, NaN, "", false, document.все) значения:
arr.filter(x => x)
для удаления отверстия, null и, undefined:
arr.filter(x => x != null)
arr = [, null, (void 0), 0, -0, NaN, false, '', 42];
console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, NaN, false, '', 42]
console.log(arr.filter(x => x)); // [42]
console.log(arr.filter(x => x != null)); // [0, -0, NaN, false, "", 42]
С Подчеркиванием / Lodash:
общий случай использования:
_.without(array, emptyVal, otherEmptyVal);
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
со стеклотарой:
_.without(['foo', 'bar', '', 'baz', '', '', 'foobar'], '');
--> ["foo", "bar", "baz", "foobar"]
посмотреть lodash документация для без.
Если использование библиотеки является вариантом, я знаю подчеркивание.js имеет функцию compact ()http://documentcloud.github.com/underscore/ он также имеет несколько других полезных функций, связанных с массивами и коллекциями.
вот выдержка из документации:
_.компактный(массив)
возвращает копию массива со всеми удаленными ложными значениями. В JavaScript, "ложь", null, 0, "", неопределено и Нэн все ложь.
_.compact ([0, 1, false, 2, ", 3]);
=> [1, 2, 3]
@Alnitak
На Самом Деле Массив.фильтр работает во всех браузерах, если вы добавляете дополнительный код. Увидеть ниже.
var array = ["","one",0,"",null,0,1,2,4,"two"];
function isempty(x){
if(x!=="")
return true;
}
var res = array.filter(isempty);
document.writeln(res.toJSONString());
// gives: ["one",0,null,0,1,2,4,"two"]
этот код нужно добавить для IE, но фильтр и функциональные programmingis стоит ИМО.
//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license
if (!Array.prototype.filter)
{
Array.prototype.filter = function(fun /*, thisp*/)
{
var len = this.length;
if (typeof fun != "function")
throw new TypeError();
var res = new Array();
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in this)
{
var val = this[i]; // in case fun mutates this
if (fun.call(thisp, val, i, this))
res.push(val);
}
}
return res;
};
}
поскольку никто больше не упоминал об этом, и большинство людей подчеркивают, что вы также можете использовать _.without(array, *values);
.
_.without(["text", "string", null, null, null, "text"], null)
// => ["text", "string", "text"]
вам может оказаться проще перебирать массив и создавать новый массив из элементов, которые вы хотите сохранить из массива, чем пытаться перебирать и соединять, как было предложено, поскольку изменение длины массива во время его перебора может привести к проблемам.
вы можете сделать что-то вроде этого:
function removeFalsyElementsFromArray(someArray) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(someArray[index]) {
newArray.push(someArray[index]);
}
}
return newArray;
}
на самом деле вот более общее решение:
function removeElementsFromArray(someArray, filter) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(filter(someArray[index]) == false) {
newArray.push(someArray[index]);
}
}
return newArray;
}
// then provide one or more filter functions that will
// filter out the elements based on some condition:
function isNullOrUndefined(item) {
return (item == null || typeof(item) == "undefined");
}
// then call the function like this:
var myArray = [1,2,,3,,3,,,,,,4,,4,,5,,6,,,,];
var results = removeElementsFromArray(myArray, isNullOrUndefined);
// results == [1,2,3,3,4,4,5,6]
вы получаете идею-тогда у вас могут быть другие типы функций фильтра. Возможно, больше, чем тебе нужно, но я был щедр... ;)
Как насчет этого (ES6): чтобы удалить ложное значение из массива.
var arr = [0,1,2,"test","false",false,true,null,3,4,undefined,5,"end"];
arr.filter((v) => (!!(v)==true));
//output:
//[1, 2, "test", "false", true, 3, 4, 5, "end"]
вы должны использовать фильтр для получения массива без пустых элементов. Пример на ES6
const array = [1, 32, 2, undefined, 3];
const newArray = array.filter(arr => arr);
я просто добавляю свой голос к вышеуказанному " вызовите ES5 Array..filter()
с глобальным конструктором " golf-hack, но я предлагаю использовать Object
вместо String
, Boolean
или Number
как предложено выше.
в частности, в ES5 это filter()
уже не срабатывает для undefined
элементы в массиве; поэтому функция, которая универсально возвращает true
, который возвращает все элементов filter()
хиты, обязательно вернутся только non -undefined
элементы:
> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(function(){return true})
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]
, пишет ...(function(){return true;})
больше, чем писать ...(Object)
; и возвращаемое значение Object
конструктор будет, под каких обстоятельствах, какой-то объект. В отличие от примитивных боксерских конструкторов, предложенных выше, никакое возможное объектное значение не является ложным, и, следовательно, в булевой настройке Object
- это сокращение для function(){return true}
.
> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(Object)
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]
при использовании самого высокого проголосовавшего ответа выше, первый пример, я получал отдельные символы для длины строки больше 1. Ниже приведено мое решение этой проблемы.
var stringObject = ["", "some string yay", "", "", "Other string yay"];
stringObject = stringObject.filter(function(n){ return n.length > 0});
вместо того, чтобы не возвращаться, если не определено, мы возвращаемся, если длина больше 0. Надеюсь, это кому-то поможет.
возвращает
["some string yay", "Other string yay"]
var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })
console.log(r)
[1,2,3]
это работает, я тестировал его в AppJet (вы можете скопировать-вставить код на его IDE и нажать "перезагрузить", чтобы увидеть его работу, не нужно создавать учетную запись)
/* appjet:version 0.1 */
function Joes_remove(someArray) {
var newArray = [];
var element;
for( element in someArray){
if(someArray[element]!=undefined ) {
newArray.push(someArray[element]);
}
}
return newArray;
}
var myArray2 = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];
print("Original array:", myArray2);
print("Clenased array:", Joes_remove(myArray2) );
/*
Returns: [1,2,3,3,0,4,4,5,6]
*/
другой способ сделать это-воспользоваться свойством length массива : упаковать ненулевые элементы слева от массива, а затем уменьшить длину. Это алгоритм на месте-не выделяет память, слишком плохо для сборщика мусора -, и он имеет очень хорошее поведение best/average/worst case.
Это решение, по сравнению с другими здесь, от 2 до 50 раз быстрее в Chrome и от 5 до 50 раз быстрее в Firefox, как вы можете видеть здесь : http://jsperf.com/remove-null-items-from-array
приведенный ниже код добавляет не перечисляемый метод removeNull в массив, который возвращает "this" для цепочки последовательностей :
var removeNull = function() {
var nullCount = 0 ;
var length = this.length ;
for (var i=0, len=this.length; i<len; i++) { if (!this[i]) {nullCount++} }
// no item is null
if (!nullCount) { return this}
// all items are null
if (nullCount == length) { this.length = 0; return this }
// mix of null // non-null
var idest=0, isrc=length-1;
length -= nullCount ;
while (true) {
// find a non null (source) slot on the right
while (!this[isrc]) { isrc--; nullCount--; }
if (!nullCount) { break } // break if found all null
// find one null slot on the left (destination)
while ( this[idest]) { idest++ }
// perform copy
this[idest]=this[isrc];
if (!(--nullCount)) {break}
idest++; isrc --;
}
this.length=length;
return this;
};
Object.defineProperty(Array.prototype, 'removeNull',
{ value : removeNull, writable : true, configurable : true } ) ;
foo = [0, 1, 2, "", , false, 3, "four", null]
foo.filter(function(e) {
return e === 0 ? '0' : e
})
возвращает
[0, 1, 2, 3, "four"]
'злоупотребление' для ... в цикле (объект-член). => В теле цикла отображаются только истинные значения.
// --- Example ----------
var field = [];
field[0] = 'One';
field[1] = 1;
field[3] = true;
field[5] = 43.68;
field[7] = 'theLastElement';
// --- Example ----------
var originalLength;
// Store the length of the array.
originalLength = field.length;
for (var i in field) {
// Attach the truthy values upon the end of the array.
field.push(field[i]);
}
// Delete the original range within the array so that
// only the new elements are preserved.
field.splice(0, originalLength);
Это может помочь вам : https://lodash.com/docs/4.17.4#remove
var details = [
{
reference: 'ref-1',
description: 'desc-1',
price: 1
}, {
reference: '',
description: '',
price: ''
}, {
reference: 'ref-2',
description: 'desc-2',
price: 200
}, {
reference: 'ref-3',
description: 'desc-3',
price: 3
}, {
reference: '',
description: '',
price: ''
}
];
scope.removeEmptyDetails(details);
expect(details.length).toEqual(3);
scope.removeEmptyDetails = function(details){
_.remove(details, function(detail){
return (_.isEmpty(detail.reference) && _.isEmpty(detail.description) && _.isEmpty(detail.price));
});
};
лучший способ удалить пустые элементы-использовать Array.prototype.filter()
, как уже упоминалось в других ответов.
к сожалению, Array.prototype.filter()
Не поддерживается IEpolyfill добавить поддержку Array.prototype.filter()
в этих браузерах :
if (!Array.prototype.filter) {
Array.prototype.filter = function(fun/*, thisArg*/) {
'use strict';
if (this === void 0 || this === null) {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun !== 'function') {
throw new TypeError();
}
var res = [];
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++) {
if (i in t) {
var val = t[i];
if (fun.call(thisArg, val, i, t)) {
res.push(val);
}
}
}
return res;
};
}
если кто-то ищет очистку всего массива или объекта, это может помочь.
var qwerty = {
test1: null,
test2: 'somestring',
test3: 3,
test4: {},
test5: {
foo: "bar"
},
test6: "",
test7: undefined,
test8: " ",
test9: true,
test10: [],
test11: ["77","88"],
test12: {
foo: "foo",
bar: {
foo: "q",
bar: {
foo:4,
bar:{}
}
},
bob: {}
}
}
var asdfg = [,,"", " ", "yyyy", 78, null, undefined,true, {}, {x:6}, [], [2,3,5]];
function clean_data(obj) {
for (var key in obj) {
// Delete null, undefined, "", " "
if (obj[key] === null || obj[key] === undefined || obj[key] === "" || obj[key] === " ") {
delete obj[key];
}
// Delete empty object
// Note : typeof Array is also object
if (typeof obj[key] === 'object' && Object.keys(obj[key]).length <= 0) {
delete obj[key];
}
// If non empty object call function again
if(typeof obj[key] === 'object'){
clean_data(obj[key]);
}
}
return obj;
}
var objData = clean_data(qwerty);
console.log(objData);
var arrayData = clean_data(asdfg);
console.log(arrayData);
выход:
удаляет все, что является null
, undefined
, ""
, " "
, empty object
или empty array
jsfiddle здесь
этот будет удалять только пустые значения, а не фальшивые, что, я думаю, более желательно.
существует возможность также удалить значения null.
этот метод должен быть намного быстрее, чем использование splice.
function cleanArray(a, removeNull) {
var i, l, temp = [];
l = a.length;
if (removeNull) {
for (i = 0; i < l; i++) {
if (a[i] !== undefined && a[i] !== null) {
temp.push(a[i]);
}
}
} else {
for (i = 0; i < l; i++) {
if (a[i] !== undefined) {
temp.push(a[i]);
}
}
}
a.length = 0;
l = temp.length;
for (i = 0; i < l; i++) {
a[i] = temp[i];
}
temp.length = 0;
return a;
}
var myArray = [1, 2, , 3, , 3, , , 0, , null, false, , NaN, '', 4, , 4, , 5, , 6, , , , ];
cleanArray(myArray);
myArray;
используйте фильтр для удаления пустой строки в массиве.
var s = [ '1,201,karthikeyan,K201,HELPER,karthikeyan.a@limitlessmobil.com,8248606269,7/14/2017,45680,TN-KAR24,8,800,1000,200,300,Karthikeyan,11/24/2017,Karthikeyan,11/24/2017,AVAILABLE\r',
'' ]
var newArr = s.filter(function(entry) { return entry.trim() != ''; })
console.log(newArr);