编写一个采用数组并将所有零移动到最后的算法

时间:2016-03-11 12:25:44

标签: javascript

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

例如:

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

我的代码:

var moveZeros = function (arr) {

var zeros = []; 
var others = [];
var res;

var arrayLength = arr.length;
for (var i = 0; i < arrayLength; i++) {
if   (arr[i] ==  0) {
 zeros.push(arr[i]);
 } else {
      others.push(arr[i]);
 }
}
var res = others.concat( zeros );

return res;


}

我得到以下结果:

Expected:    ["a","b",null,"c","d",1,false,1,3,[],1,9,{},9,0,0,0,0,0,0,0,0,0,0],
Instead got: ["a","b",null,"c","d",1,1,3,1,9,{},9,0,0,0,false,0,0,[],0,0,0,0,0]

预期结果与我所取得的结果非常接近(见上文)。我不明白为什么我false在另一个地方?

7 个答案:

答案 0 :(得分:2)

试试这个

&#13;
&#13;
var arr = [false,1,0,1,2,0,1,3,"a"];
arr.sort(function(a,b){if (a===0){return 1}});
document.body.innerHTML += JSON.stringify(arr);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

尝试在此上下文中使用普通for loopsplice来完成工作,

var arr = [false,1,0,1,2,0,1,3,"a"];
for(var i=arr.length;i>0;i--){
  if(arr[i] === 0){  arr.push(arr.splice(i,1).pop()); }
}
console.log(arr); //[false, 1, 1, 2, 1, 3, "a", 0, 0]
document.body.innerHTML += JSON.stringify(arr);

答案 2 :(得分:1)

使用Array#splice()Array#push()

function moveZeros(a) {
    var i = a.length - 1;
    while (i--) {
        if (a[i] === 0) {
            a.push(a.splice(i, 1)[0]);
        }
    }
    return a;
};

var array = [false, 1, 0, 1, 2, 0, 1, 3, "a"];
document.write('<pre>' + JSON.stringify(moveZeros(array), 0, 4) + '</pre>');

答案 3 :(得分:0)

请使用===运算符来比较值是否为0:

if (arr[i] ===  0) {
    zeros.push(arr[i]);
} else {
   others.push(arr[i]);
}

答案 4 :(得分:0)

下面的代码段应该可以正常工作,请尝试,null的原因是arr的长度从零开始计数,因此使用<= 您应该从总长度中减去1

var moveZeros = function (arr) {
  // TODO: Program me
  let zero = []
  let others = []
  let together = []
  
    for (let i =0; i <= arr.length-1; i++){
      if (arr[i] === 0){
        zero.push(arr[i])
        }
      else{ 
        others.push(arr[i])
      }
    }
  together = others.concat(zero)
  return together
}

答案 5 :(得分:0)

var titleCase = function(title) {
var arr = [];
for (i = 0; i < title.length ; i++) {
    if (title[i] !== 0 ) {
        arr.push(title[i]);
    }
}
for (i = 0 ; i < title.length ; i++) {
    if (title[i] == 0 ) {
        arr.push(title[i]);
    }
}
return  arr;
}

答案 6 :(得分:0)

您可以使用 filter() 方法来实现您的目标。使用箭头符号可以缩短代码。例如:arr => arr === 0 是匿名过滤器函数 function(arr) { return arr === 0; }

的简写
var moveZeros = function (arr) {
    const zeros = arr.filter (arr => arr === 0);
    const others = arr.filter (arr => arr !== 0);
    return others.concat(zeros);
}