繁体   English   中英

从 Javascript 中的数组中删除空元素

[英]Remove empty elements from an array in Javascript

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

有没有一种直接的方法,还是我需要遍历它并手动删除它们?

简单的方法:

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;

arr // [1, 2, 3, 3, 4, 4, 5, 6]

删除空值

['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)

// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]

编辑:大约九年前,当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);

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

我经常看到的一种典型模式是删除虚假元素,其中包括空字符串""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,,,,]);

如果您需要删除所有空值(""、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, " "]

更新(基于 Alnitak 的评论)

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

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 特别要求“丢失”条目。

为了去除孔,你应该使用

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

用于移除空洞、空值和未定义:

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

用于去除孔和假(空、未定义、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 hole
arr[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 please
console.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 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"]

简单的 ES6

['a','b','',,,'w','b'].filter(v => v);

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);
  • 第二种方式:

     const clearArray = arr.filter(Boolean);

使用下划线/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 文档,了解 without

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

以下是他们文档的摘录:

_.compact(数组)

返回删除了所有虚假值的数组副本。 在 JavaScript 中,false、null、0、""、undefined 和 NaN 都是假的。

_.compact([0, 1, false, 2, '', 3]);

=> [1, 2, 3]

@Alnitak

如果添加一些额外的代码,实际上 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 添加的代码,但过滤器和函数式编程的价值在于 imo。

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

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

你可以这样做:

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):从数组中删除 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"]

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

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

当使用上面投票最高的答案时,第一个例子,我得到了大于 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"]

我只是将我的声音添加到上面的“使用全局构造函数调用 ES5 的Array..filter() ”高尔夫黑客中,但我建议使用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构造函数的返回值在任何情况都是某种对象。 与上面建议的原始装箱构造函数不同,没有可能的对象值是假的,因此在布尔设置中, 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]
var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })

console.log(r) 

[1,2,3]

删除所有空元素

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

 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)

您可以使用过滤器的索引和in运营商

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

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

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

下面的代码将不可枚举的 'removeNull' 方法添加到 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 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 } ) ;

那个怎么样:

js> [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,].filter(String).join(',')
1,2,3,3,0,4,4,5,6
foo = [0, 1, 2, "", , false, 3, "four", null]

foo.filter(function(e) {
    return e === 0 ? '0' : e
})

返回

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

这有效,我在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]
*/

'滥用' for ... in (object-member) 循环。 => 只有真值出现在循环体中。

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

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

只需使用array.filter(String);就可以从数组中删除所有空元素array.filter(String); 它在javascript中返回数组的所有非空元素

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

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

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

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

删除空元素的最佳方法是使用Array.prototype.filter() ,如其他答案中所述。

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

输出:

删除任何为nullundefined""" "empty objectempty array

jsfiddle 在这里

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

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

这种方法应该比使用 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);

就地解决方案:

function pack(arr) { // remove undefined values
  let p = -1
  for (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 = p
  return arr
}

let a = [1, 2, 3, undefined, undefined, 4, 5, undefined, null]
console.log(JSON.stringify(a))
pack(a)
console.log(JSON.stringify(a))

如果您使用的是 NodeJS,则可以使用clean-deep包。 使用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);

以上答案都不适用于所有类型。 下面的解决方案将删除 null, undefined, {} [] , 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 implementation
function compact(arr) {
        const compactArray = [];
        //base case 
        if(!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"])`

最简单的方法

[NaN, undefined, null, 0, 1, 2, 2000, Infinity].filter(布尔值)

这是我清理空字段的解决方案。

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

fees.map( ( e ) => e.avail ).filter( v => v!== '').map( i => parseInt( i ) );
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 zone
console.log(b);

不错...非常好我们也可以像这样替换所有数组值

Array.prototype.ReplaceAllValues = function(OldValue,newValue)
{
    for( var i = 0; i < this.length; i++ )  
    {
        if( this[i] == OldValue )       
        {
            this[i] = newValue;
        }
    }
};

这是一个使用可变参数行为和 ES2015 粗箭头表达式的示例:

Array.prototype.clean = function() {
  var args = [].slice.call(arguments);
  return this.filter(item => args.indexOf(item) === -1);
};

// Usage
var arr = ["", undefined, 3, "yes", undefined, undefined, ""];
arr.clean(undefined); // ["", 3, "yes", ""];
arr.clean(undefined, ""); // [3, "yes"];

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

1. replace "__" or more with just one "_",
2. replace preceding "_" with nothing "" and similarly 
3. 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(","));

这是另一种方法:

var arr = ["a", "b", undefined, undefined, "e", undefined, "g", undefined, "i", "", "k"]
var cleanArr = arr.join('.').split(/\.+/);

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

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

这样做怎么样

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM