在JavaScript中从数组中删除空元素

如何从JavaScript中的数组中删除空元素?

有没有简单的方法,或者我需要循环遍历并手动删除它们?

1551066 次浏览

试试这个。将您的数组传递给它,它将返回并删除空元素。*更新以解决Jason指出的bug

function removeEmptyElem(ary) {for (var i = ary.length - 1; i >= 0; i--) {if (ary[i] == undefined)  {ary.splice(i, 1);}}return ary;}

您可能会发现循环遍历数组并从您希望从数组中保留的项目中构建一个新数组比按照建议尝试循环和拼接更容易,因为在循环时修改数组的长度可能会引入问题。

你可以这样做:

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]

你得到的想法-你可以有其他类型的过滤器功能。可能比你需要的更多,但我感觉慷慨…;)

编辑:这个问题几乎在九年前就有了答案,当时Array.prototype中没有很多有用的内置方法。

现在,当然,我建议您使用filter方法。

请记住,此方法将返回一个新数组,其中包含传递您提供给它的回调函数的条件的元素。

例如,如果要删除nullundefined值:

var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];
var filtered = array.filter(function (el) {return el != null;});
console.log(filtered);

这将取决于你认为什么是“空”,例如,如果你正在处理字符串,上述函数不会删除空字符串的元素。

我经常看到的一种典型模式是删除Falsy的元素,其中包括一个空字符串""0NaNnullundefinedfalse

您可以传递给filter方法、Boolean构造函数,或者在筛选条件函数中返回相同的元素,例如:

var filtered = array.filter(Boolean);

var filtered = array.filter(function(el) { return el; });

在这两种情况下,这都是有效的,因为在第一种情况下,filter方法将Boolean构造函数作为函数调用,转换值,而在第二种情况下,filter方法在内部将回调的返回值隐式转换为Boolean

如果您正在使用稀疏数组,并且您试图摆脱“漏洞”,您可以使用filter方法传递返回true的回调,例如:

var sparseArray = [0, , , 1, , , , , 2, , , , 3],cleanArray = sparseArray.filter(function () { return true });
console.log(cleanArray); // [ 0, 1, 2, 3 ]

老答案:不要这样做!

我使用这个方法,扩展原生Array原型:

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,,,,]);

如果您有Javascript 1.6或更高版本,您可以使用#0使用简单的return true回调函数,例如:

arr = arr.filter(function() { return true; });

因为.filter会自动跳过原始数组中缺失的元素。

上面链接的MDN页面还包含一个不错的错误检查版本filter,可以在不支持官方版本的JavaScript解释器中使用。

请注意,这不会删除null条目或具有显式undefined值的条目,但OP特别要求“丢失”条目。

这个工作,我在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]*/

@陈志立

实际上Array.filter可以在所有浏览器上运行,如果你添加一些额外的代码。

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添加的代码,但过滤器和函数式编程是值得的。

//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 thisif (fun.call(thisp, val, i, this))res.push(val);}}
return res;};}

使用正则表达式过滤掉无效条目

array = array.filter(/\w/);filter + regexp

几个简单的方法:

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]

或-(仅适用于类型为“text”的单个数组项)

['','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// [1,2,3,3,[],Object{},5,6]

jQuery:

var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];    
arr = $.grep(arr, n => n == 0 || n);// [1, 2, 3, 3, 0, 4, 4, 5, 6]

这个怎么样:

js> [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,].filter(String).join(',')1,2,3,3,0,4,4,5,6

干净的方式去做。

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"]

如果您需要删除所有空值(“”、null、未定义和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, " "]

更新(基于Alnitak的评论)

在某些情况下,您可能希望在数组中保留“0”并删除其他任何内容(null、未定义和“”),这是一种方法:

arr.filter(function(e){ return e === 0 || e });

返回:

["hello", 0, 1, 100, " "]

如果使用库是一个选项,我知道underscore.js有一个名为紧凑()http://documentcloud.github.com/underscore/的函数,它还有其他几个与数组和集合相关的有用函数。

以下是他们留档的节选:

_紧凑(数组)

返回删除所有false sy值的数组副本。在JavaScript中,false、null、0、“”、未定义和NaN都是false sy。

_紧凑([0,1, false,2,",3]);

=>[1,2,3]

我需要做同样的任务,遇到了这个线程。我最终使用数组“连接”使用“_”分隔符创建一个字符串,然后做一些正则表达式来:-

1. replace "__" or more with just one "_",2. replace preceding "_" with nothing "" and similarly3. replace and ending "_" with nothing ""

…然后使用数组“拆分”来制作一个清理后的数组:-

var myArr = new Array("","","a","b","","c","","","","","","","","","e","");var myStr = "";
myStr = myArr.join("_");
myStr = myStr.replace(new RegExp(/__*/g),"_");myStr = myStr.replace(new RegExp(/^_/i),"");myStr = myStr.replace(new RegExp(/_$/i),"");myArr = myStr.split("_");
alert("myArr=" + myArr.join(","));

…或在1行代码中:-

var myArr = new Array("","","a","b","","c","","","","","","","","","e","");
myArr = myArr.join("_").replace(new RegExp(/__*/g),"_").replace(new RegExp(/^_/i),"").replace(new RegExp(/_$/i),"").split("_");
alert("myArr=" + myArr.join(","));

…或者,扩展Array对象:-

Array.prototype.clean = function() {return this.join("_").replace(new RegExp(/__*/g),"_").replace(new RegExp(/^_/i),"").replace(new RegExp(/_$/i),"").split("_");};
var myArr = new Array("","","a","b","","c","","","","","","","","","e","");
alert("myArr=" + myArr.clean().join(","));

我只是将我的声音添加到上面的“使用全局构造函数调用ES5的Array..filter()”Golf-hack中,但我建议使用Object而不是上面建议的StringBooleanNumber

具体来说,ES5的filter()已经不会触发数组中的undefined元素;所以一个普遍返回true的函数,返回所有元素filter()命中,必然只返回非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构造函数的返回值将在任何情况下是某种对象。与上面建议的原始拳击构造函数不同,没有可能的对象值是false sey,因此在布尔设置中,Objectfunction(){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]

下划线/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留档

只有一条线:

[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]

另一种方法是利用数组的长度属性:将非空项打包在数组的“左侧”,然后减少长度。它是一个就地算法-不分配内存,对垃圾收集器来说太糟糕了-它具有非常好的最佳/平均/最坏情况行为。

与这里的其他解决方案相比,这个解决方案在Chrome上快2到50倍,在Firefox上快5到50倍,正如您在这里看到的:http://jsperf.com/remove-null-items-from-array

下面的代码将不可枚举的“demveNull”方法添加到Array中,该方法为菊花链返回“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 nullif (!nullCount) { return this}// all items are nullif (nullCount == length) { this.length = 0; return this }// mix of null // non-nullvar idest=0, isrc=length-1;length -= nullCount ;while (true) {// find a non null (source) slot on the rightwhile (!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 copythis[idest]=this[isrc];if (!(--nullCount)) {break}idest++;  isrc --;}this.length=length;return this;};
Object.defineProperty(Array.prototype, 'removeNull',{ value : removeNull, writable : true, configurable : true } ) ;

不错,不错我们也可以像这样替换所有数组值

Array.prototype.ReplaceAllValues = function(OldValue,newValue){for( var i = 0; i < this.length; i++ ){if( this[i] == OldValue ){this[i] = newValue;}}};
foo = [0, 1, 2, "", , false, 3, "four", null]
foo.filter(e => e === 0 ? true : e)

返回

[0, 1, 2, 3, "four"]

如果你确定你的数组中没有任何0,它看起来会更好:

foo.filter(e => e)

当使用上面投票最高的答案时,第一个例子,我得到的字符串长度大于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 arr = ["a", "b", undefined, undefined, "e", undefined, "g", undefined, "i", "", "k"]var cleanArr = arr.join('.').split(/\.+/);

由于没有其他人提到它,大多数人都在他们的项目中包含下划线,因此您也可以使用_.without(array, *values);

_.without(["text", "string", null, null, null, "text"], null)// => ["text", "string", "text"]

以下是使用可变参数行为和ES2015胖箭头表达式的示例:

Array.prototype.clean = function() {var args = [].slice.call(arguments);return this.filter(item => args.indexOf(item) === -1);};
// Usagevar arr = ["", undefined, 3, "yes", undefined, undefined, ""];arr.clean(undefined); // ["", 3, "yes", ""];arr.clean(undefined, ""); // [3, "yes"];

这个(ES6)怎么样:从数组中删除Falsy值。

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"]

删除空元素的最佳方法是使用#0,正如在其他答案中已经提到的那样。

不幸的是,IE<9不支持Array.prototype.filter()。如果您仍然需要支持IE8或更旧版本的IE,您可以使用以下聚填充在这些浏览器中添加对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;};}

'滥用'for… in(对象成员)循环。=>只有truthy值出现在循环主体中。

// --- 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);

这样做怎么样

// Removes all falsy valuesarr = arr.filter(function(array_val) { // creates an anonymous filter funcvar x = Boolean(array_val); // checks if val is nullreturn x == true; // returns val to array if not null});

如果有人正在寻找清理整个数组或对象,这可能会有所帮助

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 objectif (typeof obj[key] === 'object' && Object.keys(obj[key]).length <= 0) {delete obj[key];}// If non empty object call function againif(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);

输出:

删除任何nullundefined""" "empty objectempty array的内容

jsfiddle这里

这个只会删除空值而不是假值,我认为这更可取。

还有一个选项可以删除空值。

这种方法应该比使用拼接快得多。

    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;

简单的es6

['a','b','',,,'w','b'].filter(v => v);
var data = [null, 1,2,3];var r = data.filter(function(i){ return i != null; })

console.log(r)

[1,2,3]

这可能会帮助你: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));});};

使用过滤器删除数组中的空字符串。

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); 

您应该使用过滤器来获取不带空元素的数组。ES6上的示例

const array = [1, 32, 2, undefined, 3];const newArray = array.filter(arr => arr);

为了消除漏洞,您应该使用

arr.filter(() => true)arr.flat(0) // New in ES2019

对于删除孔,空,和,未定义:

arr.filter(x => x != null)

用于删除孔,和,false sy(null, un憎恨,0,-0,0n, NaN,"", false,document.all)值:

arr.filter(x => x)

arr = [, null, (void 0), 0, -0, 0n, NaN, false, '', 42];console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, 0n, NaN, false, '', 42]console.log(arr.filter(x => x != null)); // [0, -0, 0n, NaN, false, "", 42]console.log(arr.filter(x => x)); // [42]

备注:

  • 洞是一些没有元素的数组索引。
arr = [, ,];console.log(arr[0], 0 in arr, arr.length); // undefined, false, 2; arr[0] is a holearr[42] = 42;console.log(arr[10], 10 in arr, arr.length); // undefined, false, 43; arr[10] is a hole
arr1 = [1, 2, 3];arr1[0] = (void 0);console.log(arr1[0], 0 in arr1); // undefined, true; a[0] is undefined, not a hole
arr2 = [1, 2, 3];delete arr2[0]; // NEVER do this pleaseconsole.log(arr2[0], 0 in arr2, arr2.length); // undefined, false; a[0] is a hole
  • 上述所有方法都返回给定数组的副本,而不是就地修改它。
arr = [1, 3, null, 4];filtered = arr.filter(x => x != null);console.log(filtered); // [1, 3, 4]console.log(arr); // [1, 3, null, 4]; not modified
var data= {myAction: function(array){return array.filter(function(el){return (el !== (undefined || null || ''));}).join(" ");}};var string = data.myAction(["I", "am","", "working", "", "on","", "nodejs", "" ]);console.log(string);

输出:

我正在开发nodejs

它将从数组中删除空元素并显示其他元素。

ES6:

let newArr = arr.filter(e => e);

实际上,你可以使用ES6+方法,假设数组如下:

const arr = [1,2,3,undefined,4,5,6,undefined,7,8,undefined,undefined,0,9];

答案可能是以下两种方式之一:

  • 第一种方式:

    const clearArray = arr.filter(i => i); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
  • 第二种方式:

    const clearArray = arr.filter(Boolean); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

2022年10月14日更新:

这两个答案并不完全正确,即使在给定的例子中,是的,它有效,但请注意给定数组中的数字0,通过两种方式,数字零都消失了,它显然与使用布尔强制检查项目有关。

一个完全正确的方法是检查nulish并删除它们:

const notNil = (i) => !(typeof i === 'undefined' || i === null);
const clearArray = arr.filter(i => isNil(i));

const arr = [1,2,3,undefined,4,5,6,undefined,7,8,undefined,undefined,0,9];const notNil = (i) => !(typeof i === 'undefined' || i === null);
console.log("Not nil: ", arr.filter(notNil));

这是我对干净的空字段的解决方案。

从费用对象开始:仅获取有效属性(带map)过滤空字段(带过滤器)解析结果为整数(带map)

fees.map( ( e ) => e.avail ).filter( v => v!== '').map( i => parseInt( i ) );

到位的解决方案:

function pack(arr) { // remove undefined valueslet p = -1for (let i = 0, len = arr.length; i < len; i++) {if (arr[i] !== undefined) { if (p >= 0) { arr[p] = arr[i]; p++ } }else if (p < 0) p = i}if (p >= 0) arr.length = preturn arr}
let a = [1, 2, 3, undefined, undefined, 4, 5, undefined, null]console.log(JSON.stringify(a))pack(a)console.log(JSON.stringify(a))
var a = [{a1: 1, children: [{a1: 2}, undefined, {a1: 3}]}, undefined, {a1: 5}, undefined, {a1: 6}]function removeNilItemInArray(arr) {if (!arr || !arr.length) return;for (let i = 0; i < arr.length; i++) {if (!arr[i]) {arr.splice(i , 1);continue;}removeNilItemInArray(arr[i].children);}}var b = a;removeNilItemInArray(a);// Always keep this memory zoneconsole.log(b);

删除所有空元素

如果数组包含空对象、数组和字符串以及其他空元素,我们可以使用以下方法删除它们:

const arr = [ [], ['not', 'empty'], {}, { key: 'value' }, 0, 1, null, 2, "", "here", " ", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ]
let filtered = JSON.stringify(arr.filter((obj) => {return ![null, undefined, ''].includes(obj)}).filter((el) => {return typeof el != "object" || Object.keys(el).length > 0}))
console.log(JSON.parse(filtered))

简单压缩(从数组中删除空元素)

使用ES6:

const arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]
let filtered = arr.filter((obj) => { return ![null, undefined].includes(obj) })
console.log(filtered)

使用纯Javascript->

var arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]
var filtered = arr.filter(function (obj) { return ![null, undefined].includes(obj) })
console.log(filtered)

所有空元素都可以从数组中删除,只需使用array.filter(String);它在javascript

中返回数组的所有非空元素

您可以使用带索引和in运算符的过滤器

let a = [1,,2,,,3];let b = a.filter((x,i)=> i in a);
console.log({a,b});

如果您使用的是NodeJS,则可以使用清洁深度包。之前使用npm i clean-deep

const cleanDeep = require('clean-deep');var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];const filterd = cleanDeep(array);console.log(filterd);

要从数组中删除未定义的元素,您可以简单地使用

const array = [{ name: "tim", age: 1 },undefined,{ name: "ewrfer", age: 22 },{ name: "3tf5gh", age: 56 },null,{ name: "kygm", age: 19 },undefined,];console.log(array.filter(Boolean));

上面的答案都不适用于所有类型。下面的解决方案将删除null、untex、{}[]NaN并保留日期字符串,最好的是它甚至从嵌套对象中删除。

function removeNil(obj) {// recursively remove null and undefined from nested object too.return JSON.parse(JSON.stringify(obj), (k,v) => {if(v === null || v === '') return undefined;// convert date string to date.if (typeof v === "string" && /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.test(v))return new Date(v);// remove empty array and object.if(typeof v === 'object' && !Object.keys(v).length) return undefined;return v;});}

function removeNil(obj) {// recursively remove null and undefined from nested object too.return JSON.parse(JSON.stringify(obj), (k,v) => {if(v === null || v === '') return undefined;// convert date string to date.if (typeof v === "string" && /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.test(v))return new Date(v);// remove empty array and object.if(typeof v === 'object' && !Object.keys(v).length) return undefined;return v;});}  
const ob = {s: 'a',b: 43,countries: [ 'a', 'b', 'c' ],l: null,n: { ks: 'a', efe: null, ce: '' },d: new Date(),nan: NaN,k: undefined,emptyO: {},emptyArr: [],} 
const output = removeNil(ob); 
console.log(output);console.log('Tests: ', ob.countries.length, typeof(ob.d))

// recursive implementationfunction compact(arr) {const compactArray = [];//base caseif(!arr.length) return []if(typeof arr[0] !== "undefined"&& arr[0]!==null && arr[0] !== " " &&arr[0]!== false &&arr[0]!== 0){compactArray.push(arr[0]);}return compactArray.concat(compact(arr.slice(1)))}    
compact([1,0,false,null,undefined,"banana"])`