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

时间:2008-11-11 15:48:54

标签: javascript arrays node.js

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

是否有直接的方法,或者我是否需要循环并手动删除它们?

47 个答案:

答案 0 :(得分:1248)

简单方法:

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

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, ()=>{}]

答案 1 :(得分:714)

编辑:这个问题差不多9年前得到解答,当时Array.prototype中没有太多有用的内置方法。

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

请记住,此方法将返回一个新数组,其元素通过您提供给它的回调函数的条件,例如,如果要删除{{1} }或null值:

undefined

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

我经常使用的一个常见模式是删除 falsy 元素,其中包含空字符串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);""0,{ {1}},NaNnull

您可以简单地传递给undefined方法,false构造函数,或者只是在过滤条件函数中返回相同的元素,例如:

filter

或者

Boolean

这两种方式都有效,因为第一种情况下的var filtered = array.filter(Boolean); 方法将var filtered = array.filter(function(el) { return el; }); 构造函数作为函数调用,转换值,在第二种情况下调用filter方法在内部将回调的返回值隐式转换为Boolean

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

Boolean

旧回答:不要这样做!

我使用此方法,扩展原生数组原型:

filter

或者你可以简单地将现有元素推送到其他数组中:

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

console.log(cleanArray); // [ 0, 1, 2, 3 ]

答案 2 :(得分:220)

如果需要删除所有空值(“”,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”并删除其他任何内容(null,undefined和“”),这是一种方式:

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

返回:

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

答案 3 :(得分:127)

只需一个班轮:

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

答案 4 :(得分:117)

如果你有Javascript 1.6或更高版本,你可以使用Array.filter使用简单的return true回调函数,例如:

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

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

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

请注意,这不会删除null条目,也不会删除具有明确undefined值的条目,但OP会明确请求“缺少”条目。

答案 5 :(得分:52)

要删除孔,您应该使用

arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this

用于删除孔,和,falsy(null,undefined,0,-0,NaN,&#34;&#34;,false,document.all)值:

arr.filter(x => x)

删除hole,null和undefined:

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

&#13;
&#13;
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]
&#13;
&#13;
&#13;

答案 6 :(得分:51)

干净利落的方式。

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

答案 7 :(得分:31)

简单的ES6

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

答案 8 :(得分:20)

使用Underscore / 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 documentation for without

答案 9 :(得分:15)

只是ES6和更高版本的方法,假设数组在下面:

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

简单方法:

 const clearArray = arr.filter( i => i );

答案 10 :(得分:15)

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

以下是他们的文档摘录:

  

_.compact(array)

     

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

     

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

     

=&GT; [1,2,3]

答案 11 :(得分:14)

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

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

答案 12 :(得分:13)

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

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

答案 13 :(得分:8)

您可能会发现在数组上循环并从要保留的数据中构建一个新数组比通过尝试循环和拼接更容易,因为修改了数组的长度正在循环可以引入问题。

你可以这样做:

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]

你明白了 - 你可以拥有其他类型的过滤功能。可能比你需要的多,但我感觉很慷慨......;)

答案 14 :(得分:6)

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

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

答案 15 :(得分:6)

toId

答案 16 :(得分: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"]

答案 17 :(得分: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"]

答案 18 :(得分:3)

您可以将过滤器与索引和in运算符配合使用

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

console.log({a,b});

答案 19 :(得分: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)

答案 20 :(得分:3)

var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })
console.log(r) 
  

[1,2,3]

答案 21 :(得分:3)

我只是简单地将我的声音添加到上面的“使用全局构造函数”来调用ES5的Array..filter()“golf-hack,但我建议使用Object代替String,{{1如上所述,或Boolean

具体来说,ES5的Number已经不会触发数组中的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;})更长;在{em>任何情况下,...(Object)构造函数的返回值将是某种对象。与上面建议的primitive-boxing-constructors不同,没有可能的对象值是假的,因此在布尔设置中,ObjectObject的简写。

function(){return true}

答案 22 :(得分:2)

那是怎么回事:

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

答案 23 :(得分:1)

foo = [0, 1, 2, "", , false, 3, "four", null]

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

<强>返回

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

答案 24 :(得分:1)

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

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

答案 25 :(得分:1)

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

答案 26 :(得分:1)

这可能会对您有所帮助: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));
            });
        };

答案 27 :(得分:1)

&#39;误用&#39; for ... in(object-member)循环。   =&GT;只有truthy值出现在循环体中。

<center>
<img src="logo.png" style="
    position: fixed;
    top: 13px;
    left: 42%;
">
<br>
<br>
<label for="show-menu" class="show-menu">Menu</label>
    <input type="checkbox" id="show-menu" role="button">
        <ul id="menu">
        <li><a href="/">Home</a></li>
        <li>
            <a href="#">↓ Apps ↓</a>
            <ul class="hidden">
                <li><a href="hw.html">Day To Day HW</a></li>
                <li><a href="jokes.html">Day To Day Jokes</a></li>
            </ul>
        </li>
        <li><a href="about.html">About</a></li>
        <li><a href="contact.html">Contact</a></li>
    </ul>

答案 28 :(得分:1)

只需使用以下命令即可从数组中删除所有空元素 array.filter(String); 它返回JavaScript中数组的所有非空元素

答案 29 :(得分:1)

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

与其他人相比,此解决方案在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 } ) ;

答案 30 :(得分:0)

就地解决方案:

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

答案 31 :(得分:0)

这是我解决空白字段的方法。

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

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

答案 32 :(得分:0)

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

答案 33 :(得分:0)

另一种方式:

function filter_array(test_array) {
    var index = -1,
        arr_length = test_array ? test_array.length : 0,
        resIndex = -1,
        result = [];

    while (++index < arr_length) {
        var value = test_array[index];

        if (value) {
            result[++resIndex] = value;
        }
    }

    return result;
}
console.log(filter_array([NaN, 0, 15, false, -22, '',undefined, 47, null]));

答案 34 :(得分:0)

如果您使用的是 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);

答案 35 :(得分:0)

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

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

答案 36 :(得分:0)

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

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

答案 37 :(得分:0)

使用filter删除数组中的空字符串。

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

答案 38 :(得分:0)

这个只删除空值而不是虚假值,我认为这更值得。

还可以选择删除空值。

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

答案 39 :(得分:0)

如果有人想要清理整个数组或对象,这可能有帮助

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 here

答案 40 :(得分:0)

删除空元素的最佳方法是使用Array.prototype.filter(),如其他答案中已提到的那样。

不幸的是,IE&lt; 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;
  };
}

答案 41 :(得分:-1)

以下是使用可变行为的示例&amp; ES2015胖箭表达:

def conversation_params
  params.require(:conversation).permit(:sender_id, :recipient_id)
end

答案 42 :(得分:-1)

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

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

答案 43 :(得分:-2)

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

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

...然后使用数组“split”来制作一个清理过的数组: -

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(","));

...或在一行代码中: -

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(","));

答案 44 :(得分:-2)

这是另一种方法:

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

答案 45 :(得分:-3)

这样做怎么样?

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

答案 46 :(得分:-4)

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

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