Javascript:如何从数组中清除未定义的值

时间:2012-03-07 05:04:20

标签: javascript arrays undefined-index

我正在尝试遍历数组并删除并跳过元素,直到只有一个存在。我已经尝试过拼接,但它会让我的循环变得混乱,因为来自arr [1]的元素会变成arr [0]等。

假设有10个人。我想删除1号人员然后保留2号人员然后移除3号人员并保留4号人员。此模式将一直持续到只剩下一人。

任何形式的帮助都可以。

13 个答案:

答案 0 :(得分:27)

过滤虚假物品:

var a=[1,2,"b",0,{},"",NaN,3,undefined,null,5];
var b=a.filter(Boolean); // [1,2,"b",{},3,5]

答案 1 :(得分:9)

你不应该在迭代过程中更改集合,不仅仅是JavaScript,而是所有语言,定义一个新数组并在其中添加要删除的数组,并稍后迭代该数组以从第一个删除。

答案 2 :(得分:7)

拼接时,只需递减循环索引即可。

有很多好的建议,我会发布不同选项的代码,你可以决定使用哪个

拼接时减少索引 http://jsfiddle.net/mendesjuan/aFvVh/

var undef;
var arr = [1,2, undef, 3, 4, undef];
for (var i=0; i < arr.length; i++) {
    if ( arr[i] === undef ) {
        arr.splice(i,1);
        i--;
    }
}

向后循环 http://jsfiddle.net/mendesjuan/aFvVh/1/

var undef;
var arr = [1,2, undef, 3, 4, undef];
for (var i=arr.length - 1; i >=0; i--) {
    if ( arr[i] === undef ) {
        arr.splice(i,1);
    }
}

复制到新阵列 http://jsfiddle.net/mendesjuan/aFvVh/2/

var undef;
var arr = [1,2, undef, 3, 4, undef];
var temp = [];
for (var i=0; i < arr.length; i++) {
    if ( arr[i] !== undef ) {
        temp.push(arr[i])
    }
}
arr = temp;

使用过滤器,这只是创建新数组的一种奇特方式

var undef;
var arr = [1,2, undef, 3, 4, undef];
arr = arr.filter(function(item){
    return item !== undef;
});

在所有这些例子的最后,arr将是[1,2,3,4]

<强>性能

IE 11,FF和Chrome同意Array.splice是最快的。 10次​​(Chrome),20次(IE 11)与Array.filter.一样快与Array.slice相比,将项目放入新阵列的速度也很慢。看到 http://jsperf.com/clean-undefined-values-from-array2

我很惊讶地看到IE在这里领先,并看到Chrome背后的FF和IE。我认为我没有对这个结果进行过测试。

答案 3 :(得分:3)

向后循环 。 (因此,删除项目不会影响尚未处理的元素的索引。)

答案 4 :(得分:3)

如果你有任何机会使用CoffeeScript然后从数组中删除undefined,请执行此操作

values = ['one', undefined]
values = (item for item in values when item != undefined) 

values
/* => ['one'] */

答案 5 :(得分:1)

令人惊讶的是,没有人回答过最好和最正确的方法:

  1. 创建新数组
  2. 迭代旧数组,只将想要保留的元素推送到新数组
  3. 一些功劳归于@nnnnnn comment

答案 6 :(得分:0)

没有准确收集您要实现的内容,但我觉得您依赖于数组中项目的位置索引来继续您的程序。在这种情况下,我会建议一个散列数组,即一个Key&lt;&gt; Value对数组。

在这种情况下,arr["2"]始终指向您最初放入其中的项目。因此,您可以逻辑/数字循环,而不必担心位置的变化。

谨防类型转换风险和陷阱!

答案 7 :(得分:0)

您最好的选择是创建数组的副本,然后从原始数据拼接。

或者只是使用集合(key-&gt;值)并删除密钥,例如

 People = {a: "Person A", b: "Person B", c:"Person C"};
 delete People.a;
 delete People.c;  //now the People collection only has 1 entry.

您可以使用数字替换a,b,c作为示例,

 People = {0: "Person A", 1: "Person B", 2:"Person C"};
 delete People[0];
 delete People[1];

答案 8 :(得分:0)

function removeUndefined(array)
{
    var i = 0;
    while (i < array.length)
        if (typeof array[i] === 'undefined')
            array.splice(i, i);
        else
            i++;
    return array;
}
编辑:我是根据标题写的。看起来这个问题会有一些完全不同的东西。

答案 9 :(得分:0)

这是你的样本

<script lanauge = "javascript">
    var arr = ["1","2","3","4"];
    delete arr[1];// arr[1] is undefined
    delete arr[2];// arr[2] is undefined

    // now arr.length is 4

    var todelete = [];
    for (i = 0 ; i < arr.length ;i++)
    {
        if (typeof arr[i] == 'undefined') todelete.push(i);
    }

    todelete.sort(function(a, b) { return b-a }); // make the indeies from big to small

    for (i = 0;i < todelete.length; i ++)
    {
        arr.splice(todelete[i],1);
    }

    // now arr.length is 2

</script>

答案 10 :(得分:0)

这可能不是您想要的,但您可以轻松计算此过程结束时的最终元素,然后抓住它。假设数组的元素是连续的并从arr [0]开始,你可以找到:

var logBase2OfLength = Math.floor(Math.log(arr.length) / Math.log(2));
var finalElement = arr[(1 << logBase2OfLength) - 1];

基本上,如果你取2的整数次幂小于或等于数组中元素的数量,那就是在所有循环和删除之后将保留的元素的位置。

答案 11 :(得分:0)

Set extractor = CreateObject("Bytescout.PDFExtractor.StructuredExtractor")

extractor.RegistrationName = "demo"
extractor.RegistrationKey = "demo"

' Load sample PDF document
extractor.LoadDocumentFromFile "../../sample3.pdf"

For ipage = 0 To extractor.GetPageCount() - 1 

    ' starting extraction from page #"
    extractor.PrepareStructure ipage

    rowCount = extractor.GetRowCount(ipage)

    For row = 0 To rowCount - 1 
        columnCount = extractor.GetColumnCount(ipage, row)

        For col = 0 To columnCount-1
            WScript.Echo "Cell at page #" +CStr(ipage) + ", row=" & CStr(row) & ", column=" & _
                CStr(col) & vbCRLF & extractor.GetCellValue(ipage, row, col)
        Next
    Next
Next

答案 12 :(得分:-1)

  while(yourarray.length>1) //only one left
    {
    // your code
    }