Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:如何从数组中清除未定义的值_Javascript_Arrays_Undefined Index - Fatal编程技术网

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

Javascript:如何从数组中清除未定义的值,javascript,arrays,undefined-index,Javascript,Arrays,Undefined Index,我试图循环遍历一个数组,删除并跳过元素,直到只有一个元素存在。我尝试过拼接,但它打乱了我的循环,因为arr[1]中的元素随后变成了arr[0]等 假设有10个人。我想删除人员1,然后保留人员2,然后删除人员3,保留人员4。这种模式将持续下去,直到只剩下一个 任何帮助都行。拼接时,只需减小循环索引 有很多很好的建议,我将发布不同选项的代码,您可以决定使用哪个选项 拼接时的衰减指数 复制到新阵列 在所有这些示例结束时,arr将为[1,2,3,4] 性能 IE 11、FF和Chrome一致认为,Ar

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

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


任何帮助都行。

拼接时,只需减小循环索引

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

拼接时的衰减指数

复制到新阵列

在所有这些示例结束时,arr将为[1,2,3,4]

性能

IE 11、FF和Chrome一致认为,
Array.splice
是最快的。10倍(Chrome),20倍(IE 11)快于
Array.filter.
将项目放入新数组与
Array.slice
相比也很慢。看见


看到IE在这里领先,看到FF和IE背后的Chrome,我真的很惊讶。我想我从来没有用这个结果运行过测试。

在迭代过程中,你不应该更改集合,不仅仅是JavaScript,而是所有语言,定义一个新的数组,并在其中添加那些你想删除的,然后重复该循环,从第一个循环中删除。

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

没有准确收集您试图实现的目标,但我觉得您依赖于数组中项目的位置索引来继续您的程序。在本例中,我建议使用散列数组,即键值对数组

  while(yourarray.length>1) //only one left
    {
    // your code
    }
在这种情况下,
arr[“2”]
始终指向您最初放置在其中的项目。因此,您可以逻辑/数字地循环,而不用担心位置的变化


小心类型转换的风险和陷阱

最好是创建阵列的副本,然后从原始阵列拼接

或者只需使用集合(键->值)并删除键即可

 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];
函数removeUndefined(数组)
{
var i=0;
while(i

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

这是给你的一个示例

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

var arr=[“1”、“2”、“3”、“4”];
删除arr[1];//arr[1]未定义
删除arr[2];//arr[2]未定义
//现在arr.length是4
var todelete=[];
对于(i=0;i
这可能不是您想要的,但是您可以轻松地计算出此过程结束时的最终元素,然后抓住它。假设数组的元素是连续的并且从arr[0]开始,您可以找到:

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

var finalElement=arr[(1令人惊讶的是,没有人回答了最佳和正确的方法:

  • 创建新阵列
  • 迭代旧数组,只将要保留的元素推送到新数组中

  • 如果您有机会从数组中删除未定义的内容,请执行此操作

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

    过滤错误项:

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


    如果您控制索引,您可以更改它。但是,这比我的建议更不容易出错。如何将要保留的数组添加到第二个数组中,然后在最后用第二个数组替换第一个数组?省去了第二次迭代。我的意见是,我们应该尽量使代码简单易读,我的expedie我只是告诉我,写一个奇怪的复杂循环只会带来bug并迷惑其他人。我误解了Simon的建议,真正简单的方法是NNNN建议的(在这个答案下),将其复制到一个新数组i最终使用了3个数组,第一个作为原始数组,这是循环的基础。在循环中使用了2个数组。第二个数组包含在该迭代中跳过的数组,另一个是空数组。在每次迭代结束时,我都会这样做。
    arr1=arr2;
    arr2=arr3;
    我不确定是否这是最好的解决方案,但正如Simon所说,这很有意义,使它变得更简单,而且很有效。你没有抓住要点,OP knows to splice,问题是删除一个item@JuanMendes,最好使用键->值集合,而不是“直到只剩下一个”是什么意思?在通过阵列一次后,您将其从10个元素(人)减少到5个元素-您是说您希望继续重复该过程(重复通过)直到数组中只有一个元素?如果你只想要一个元素…那么为什么你需要一个循环?@MathWizz,这也是我的想法,剩余元素的位置可以在不需要循环的情况下计算出来。是的,我将重复这个过程,直到只剩下一个元素。
    length
    是数组的属性,而不是循环如果数组[i]为空或为假或为0,它也将被删除。我想你的意思是
    .splice(i,1)
    @shenhengbin我已经解决了。那
    .sort()
    方法没有按评论所说的那样进行。如果没有回调函数,它将进行升序字典排序。与使用splice@Alexovied999相比,它的速度相当慢。我通常会检查未定义或TrueAlexovied999。哇!谢谢!
    function removeUndefined(array)
    {
        var i = 0;
        while (i < array.length)
            if (typeof array[i] === 'undefined')
                array.splice(i, i);
            else
                i++;
        return array;
    }
    
    <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>
    
    var logBase2OfLength = Math.floor(Math.log(arr.length) / Math.log(2));
    var finalElement = arr[(1 << logBase2OfLength) - 1];
    
    values = ['one', undefined]
    values = (item for item in values when item != undefined) 
    
    values
    /* => ['one'] */
    
    var a=[1,2,"b",0,{},"",NaN,3,undefined,null,5];
    var b=a.filter(Boolean); // [1,2,"b",{},3,5]
    
    >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);