簡體   English   中英

數組拼接-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)
}

是一個工作的小伙子。

對此表示歉意,我知道問題很小,但是我的大腦現在停止工作了,我需要換新的眼睛。

用編寫的方式,您需要以相反的順序循環。 當您刪除索引時,最終將跳過索引。 反向循環可避免您跳過它們。

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

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

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

使用另一個存儲新值的數組,您可以靈活地對第一個數組的數據執行所需的任何操作。

使用對象的一種不錯的小方法-忙着學習它們,所以只需發布一個變體

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語句中循環時正在修改數組。

是您的示例的一個有用的工具。

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以外的其他順序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM