阵列拼接 - Javascript

时间:2015-10-23 13:34:19

标签: javascript arrays splice

这是一个非常小的问题,对于我的生活,我无法弄清楚它是什么。我的大脑已经锁定了思维。我需要别人看看这段代码。

代码的输出应为:[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是一名工作人员。

为此道歉,我知道这个问题非常小,但我的大脑已停止工作,我需要一双新鲜的眼睛。

9 个答案:

答案 0 :(得分:5)

按照你编写的方式,你需要以相反的顺序循环。删除索引时,最终会跳过索引。反向循环使您不会跳过它们。

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

答案 1 :(得分:0)

您可以使用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)
    }

答案 2 :(得分:0)

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

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

console.log(result);

答案 3 :(得分:0)

您正在使用索引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)
}

答案 4 :(得分:0)

每次都喜欢内置功能。<​​/ p>

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

答案 5 :(得分:0)

为什么不使用临时数组来提供帮助?您的代码的问题是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);
}

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

答案 6 :(得分:0)

使用对象的一个​​很好的方法 - 忙于学习它们,所以只需发布一个变体的结合

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/

答案 7 :(得分:0)

问题是你正在修改一个数组,同时在if语句中循环它。

Here是你的榜样的工作人员。

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

while(len) {

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

    --len;
}

答案 8 :(得分:0)

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

meteor create --package example

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