2015-10-23 8 views
0

Его очень маленькая проблема, и для жизни меня я не могу понять, что это такое. Мой мозг заперся от мышления. Мне нужен кто-то другой, чтобы посмотреть этот код.Array Splice - Javascript

Выходной код должен быть: [1,0,0,0]

UPDATE:

Функция должна быть в состоянии прочитать массив чисел, и если он находит нулей в массиве он должен переместить их до конца массива.

Выход кода продолжает прибывать, как: [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.

Извинения за это, я знаю, что проблема - это что-то очень маленькое, но мой мозг перестает работать, и мне нужны свежие глаза.

+0

Я получаю [0,0,0,1] при запуске в консоли – AdamJeffers

+0

@AdamJeffers благодарит вас за ответ. Вы попробовали плункер. Он не работает в режиме предупреждения. Снова спасибо – Skywalker

+0

Если вы пытаетесь отменить массив, попробуйте arrNum.reverse() –

ответ

5

С тем, как у вас есть написано, что вам нужно в цикле в обратном порядке. Вы удаляете индексы при удалении индекса. Зацикливание в обратном направлении не позволяет вам пропустить их.

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

Спасибо за нижний предел, результат будет правильным. – epascarello

+0

Это решение работает! Не уверен, почему голосуют. Не могли бы вы объяснить логику вашего ответа, я хочу понять это. Спасибо. – Skywalker

+0

благодарит вас за ответ. Я буду голосовать и принять его! Приветствует снова. – Skywalker

0

Вы можете использовать unshift() для вставки в начало массива и толчке() до конца ...

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) 
    } 
+0

Большое вам спасибо за ваш ответ! – Skywalker

+0

Добро пожаловать – AdamJeffers

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

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

console.log(result); 
+0

Большое вам спасибо за ваш ответ! – Skywalker

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) 
} 
+0

Большое вам спасибо за ваш ответ! – Skywalker

0

Предпочитайте встроенные функции каждый раз, когда это возможно.

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

Большое вам спасибо за ваш ответ! – Skywalker

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); 
} 

С другой массив, чтобы сохранить новые значения, вы получаете гибкость, чтобы делать то, что вам нужно с данными первого массива.

+0

Большое вам спасибо за ваш ответ! – Skywalker

+0

«Функция должна иметь возможность считывать массив чисел, и если он найдет нули в массиве, он должен переместить их в конец массива». «Внутри» нули никогда не будут в начале. –

+0

Добро пожаловать! Просто для объяснения: я изменил цикл на итерации назад массива, потому что вы хотите инвертировать позиции элементов. Чтобы выполнить это, вы можете просто повторять назад, как я опубликовал. Надеюсь, поможет. :) – Fabiano

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/

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; 
} 
0

В операции, которую вы хотите сделать, это на самом деле сортировки, для удобства чтения и компактности кода, может быть, вы должны делать это вместо:

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

Он может содержать любое число и будет поддерживать порядок других чем 0

Смежные вопросы