数组拼接 - Javascript

Array Splice - Javascript

这是一个非常小的问题,对于我来说,我无法弄清楚它是什么。我的大脑已经锁定了自己,无法思考。我需要其他人看看这段代码。

代码的输出应该是:[1,0,0,0]

更新:

该函数应该能够读取一个数字数组,如果它在数组中找到任何零,它应该将它们移动到数组的末尾。

代码的输出不断出现:[0,1,0,0]

var arrNum = [0,0,0,1];

function test() {
   for(var i=0; i<arrNum.length; i++){

 if(arrNum[i] == 0){

    arrNum.splice(i,1)
    arrNum.splice(arrNum.length, 1, 0)

    }
 }
 return alert(arrNum)
}

Here 是一个正在工作的 plunker。

对此表示歉意,我知道问题很小,但我的大脑现在已经停止工作,我需要一双新的眼睛。

您可以使用 unshift() 在数组的开头插入并使用 push() 到结尾...

    var arrNum = [0,0,0,1];
    var output = [];

    function test() 
    {
       for(var i=0; i<arrNum.length; i++)
       {
         if(arrNum[i] == 0)
            output.push(0);
         else
            output.unshift(arrNum[i]);
     }
     return alert(output)
    }
var arrNum = [0,0,0,1];
var result = [];

arrNum.forEach(function(v) {
    !!v ? result.unshift(v) : result.push(v);
});

console.log(result);

按照你写的方式,你需要按相反的顺序循环。当您删除索引时,您最终会跳过索引。反向循环可防止您跳过它们。

for(var i=arrNum.length-1; i>=0; i--){ 

您正在使用索引 i = 0,1,2,3 进行迭代,同时删除数组的第一个元素。所以你的迭代看不到 1,它在移动到已经迭代的索引时跳过。最简单的方法就是反转循环来绕过这个问题。

var arrNum = [0,0,0,1];

function test() {
  for(var i= arrNum.length; i >= 0; i--){

    if(arrNum[i] == 0){
      arrNum.splice(i,1)
      arrNum.splice(arrNum.length, 1, 0)
    }
  }
  return alert(arrNum)
}

尽可能使用内置函数。

var output = [];
[0,0,0,1].forEach(function(num) {
  if(num == 0) output.push(0);
  else output.unshift(num)
})

为什么不用临时数组来帮忙呢?您的代码的问题是 splice() 函数修改了原始数组,而您是在循环内进行的。

下面的代码可以生成您需要的内容:

var arrNum = [0,0,0,1];
var arrResult = new Array();

function test() {

   for(var i=arrNum.length-1; i>=0; i--)
   {
        arrResult.push(arrNum[i]);
   }

   arrNum = arrResult;
   return alert(arrNum);
}

使用另一个数组来存储新值,您可以灵活地对第一个数组的数据执行任何需要的操作。

一个很好的使用对象的小方法 - 忙着学习它们所以只是发布了一个变化的deligation

var methods = {
    moveZero: function(arr){
        //console.log(arr);
        var newArr = [];
        for(var i  = 0; i < arr.length; i++){
            if(arr[i] === 0){
                newArr.push(arr[i]);
            }else{
                newArr.unshift(arr[i]);
            }
        }
        console.log(newArr);
    }
}

var arrNum = Object.create(methods);
arrNum.moveZero([0,0,50,56,85,0,0,43,10,0,1]);

JSFiddle - https://jsfiddle.net/ToreanJoel/qh0xztgc/1/

问题是您在 if 语句中循环遍历数组时修改数组。

Here 是你的例子的一个工作 plunker。

var len = arrNum.length;
var index = 0;

while(len) {

    if(arrNum[index] == 0) {
        arrNum.splice(index,1);
        arrNum.push(0);
    } else {
        ++index;
    }

    --len;
}

由于您要执行的操作实际上是排序,为了代码的可读性和紧凑性,您可能应该改为这样做:

var arrNum = [0,1,0,0]; 
arrNum.sort(function(a, b) {
  return a == 0 ? 1 : 0;
});

它可以包含任何数字,并且将保持除 0 以外的顺序