数组中循环行为的Javascript

时间:2018-12-13 12:47:44

标签: javascript arrays

我目前正在学习JS,并在Codewars上遇到了一些问题。我已经写了一个函数来解决问题,但是我不明白为什么JS中的for循环会表现出它在解决方案中的作用,如果有人可以帮助我,我将非常高兴。 问题如下:

编写一种算法,该算法采用一个数组并将所有零移动到末尾,并保留其他元素的顺序。

moveZeros([1, 2, 0, 1, 0, 1, 0, 3, 0, 1]) // returns[1, 2, 1, 1, 3, 1, 0, 0, 0, 0]

我的解决方法是:

var moveZeros = function(arr) {
    let newarr = [];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] === 0) {
            newarr.push(arr[i])
        } else {
            newarr.unshift(arr[i])
        };
    }
    return newarr;
}

我的函数返回的是:

[1, 3, 1, 1, 2, 1, 0, 0, 0, 0]

为什么JS在数组中的索引为7却为什么将3放在2之前?

谢谢!

5 个答案:

答案 0 :(得分:4)

好吧unshift()将值推到数组前面。

看看这个例子。了解unshift()的工作原理。

let a = [];
 a.unshift(1);
 a.unshift(2);
 a.unshift(3);
 a.unshift(4);
console.log(a);

Push在数组的后面添加值。

在下面的示例中了解推式的工作原理。

let a = [];
     a.push(1);
     a.push(2);
     a.push(3);
     a.push(4);
console.log(a);

var moveZeros = function (arr) {
let newarr = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 0) {newarr.push(arr[i])}
else {newarr.unshift(arr[i])};
} return newarr;
}



let op = moveZeros([1, 3, 1, 1, 2, 1, 0, 0, 0, 0]);
console.log(op);

答案 1 :(得分:3)

原因是因为unshift总是将数字添加到newarr

的开头

例如,从上面的代码中,newarr将如下所示:     i=0: newarr = [1] i=1: newarr = [2,1] i=2: newarr = [2,1,0] i=3: newarr = [1,2,1,0] i=4: newarr = [1,2,1,0,0] i=5: newarr = [1,2,1,0,0,0] i=6: newarr = [1,1,2,1,0,0,0] i=7: newarr = [3,1,1,2,1,0,0,0] i=8: newarr = [3,1,1,2,1,0,0,0,0] i=9: newarr = [1,3,1,1,2,1,0,0,0,0]

答案 2 :(得分:2)

使用示例代码。您可以引入临时数组来存储所有存在的零。然后将其与 newarr

连接
var moveZeros = function(arr) {
  let newarr = []; 
  let temp = []; //store all zeros here
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === 0) {
      temp.push(arr[i])
  } else {
      newarr.push(arr[i])
  };
 }

 return newarr.concat(temp); //this moves all zeros after the array order
}

此外,如果您想要保留函数参数(即 arr 作为结果变量),则可以将每个零存储在 temporaray数组中,然后从中删除所有零。然后将 arr temp

连接
var moveZeros = function(arr) {
  let temp = []; //store all zeros here
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === 0) {
      temp.push(arr[i]);
      arr.splice(i,1); /*delete all zeros after storing them this does not affect array order*/
    } 
  }

  return arr.concat(temp);
}

答案 3 :(得分:1)

欢迎堆栈溢出。下面的代码将全零放在数组的末尾,其余的保持找到的顺序:

const moveToEnd = (arr) => {
  const [head, tail] = arr.reduce(
    ([head, tail], val) =>
      val === 0
        ? [head, tail.concat(val)]
        : [head.concat(val), tail],
    [[], []],
  );
  return head.concat(tail);
};
console.log(moveToEnd([1, 2, 0, 1, 0, 1, 0, 3, 0, 1]));

答案 4 :(得分:-1)

您可以使用sort()函数进行数组排序:

var sortedArray = [1, 2, 0, 1, 0, 1, 0, 3, 0, 1].sort(function(a,b){
 return b === 0 && (b - a) 
});

b-a表示该顺序的后代。

https://www.w3schools.com/js/js_array_sort.asp