6

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

假设有10个人。我想删除第 1 个人,然后保留第 2 个人,然后删除第 3 个人并保留第 4 个人。这种模式将一直持续到只剩下一个人。

任何形式的帮助都可以。

4

13 回答 13

29

过滤虚假项目:

var a=[1,2,"b",0,{},"",NaN,3,undefined,null,5];
var b=a.filter(Boolean); // [1,2,"b",{},3,5]
于 2014-12-15T14:48:40.727 回答
9

拼接时,只需减少循环索引。

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

拼接时递减索引 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是最快的。Array.filter.Array.slice. _ 请参阅 http://jsperf.com/clean-undefined-values-from-array2

看到 IE 在这里领先,并且看到 Chrome 落后于 FF 和 IE,我真的很惊讶。我不认为我曾经用这个结果进行过测试。

于 2012-03-07T05:07:25.040 回答
9

您不应该在迭代期间更改集合,不仅是 JavaScript,而是所有语言,定义一个新数组并添加要删除的数组,然后再迭代该数组以从第一个数组中删除。

于 2012-03-07T05:08:19.740 回答
3

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

于 2012-03-07T05:10:43.170 回答
3

如果您有任何机会使用CoffeeScript,那么要从 Array 中删除 undefined 执行此操作

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

values
/* => ['one'] */
于 2012-12-12T17:10:38.563 回答
1

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

  1. 创建新数组
  2. 迭代旧数组,只将要保留的元素推送到新数组

一些功劳归功于@nnnnnn 评论

于 2012-06-12T14:38:14.147 回答
0

没有准确收集您想要实现的目标,但我觉得您依赖数组中某个项目的位置索引来继续您的程序。在这种情况下,我建议使用散列数组,即 Key<>Value 对数组。

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

当心类型转换的风险和陷阱!

于 2012-03-07T05:11:14.120 回答
0

最好的办法是创建数组的副本,然后从原始数组拼接。

或者只是使用一个集合(键->值)并删除键,例如

 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];
于 2012-03-07T05:11:28.097 回答
0
function removeUndefined(array)
{
    var i = 0;
    while (i < array.length)
        if (typeof array[i] === 'undefined')
            array.splice(i, i);
        else
            i++;
    return array;
}

编辑:我根据标题写了这个。看起来这个问题问的是完全不同的东西。

于 2012-03-07T05:15:50.657 回答
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>
于 2012-03-07T05:26:14.377 回答
0

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

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

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

于 2012-03-07T05:56:08.090 回答
0
>If you are getting undefined during deletion of the key-pair, Then to prevent "undefined" you can try code given below to delete key-pair  


   1) test = ["1","2","3","4",""," "];
   2) var delete = JSON.stringify(test);   
      case1) delete = delete.replace(/\,""/g,'');  
         or  
      case2) delete = delete.replace(/\," "/g,'');  
         or  
      case3) delete = delete.replace(/\,null/g,'');  

   3) var result = JSON.parse(delete);  
于 2018-03-17T20:39:35.317 回答
-1
  while(yourarray.length>1) //only one left
    {
    // your code
    }
于 2012-03-07T05:10:18.740 回答