移动数组中的指定字符

时间:2016-07-08 12:40:21

标签: javascript arrays

我得到一个作为参数给出的元素列表,这是输入。

If charArray = "ab"

If Join(charArray) = "ab"

If CStr(Join(charArray)) = "ab"

脚本应该将零移动到最后而不更改其他元素顺序。 我的解决方案看起来像这段代码:

JSON.stringify(moveZeros([1,2,0,1,0,1,0,3,0,1]))

这应该将元素的值附加为零值,并将新的0值附加到数组的末尾。它只打印原始数组而不进行修改。

6 个答案:

答案 0 :(得分:2)

你有一些括号错误,错过了一些论点。您还使用数组作为参数,无需对参数进行切片。您还错过了splice

的元素数量

这不适用于[9, 0, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0]之类的内容(请参阅下面的更新)

// DOES NOT WORK
var moveZeros = function (arr) {

    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == 0) {
            arr.splice(i, 1);
            arr.push(0);
        }
    }

    console.log(arr);

    return arr;
}

工作解决方案

    var moveZeros = function(args) {
        var r = [];
        var zeros = 0;
        for (var i = 0; i < args.length; i++) {
            if (args[i] !== 0) {
                r.push(args[i]);
            } else zeros++
        }
        r = r.concat(Array(zeros).fill(0))
        console.log(r);
        return args;
    }
    JSON.stringify(moveZeros([9, 0, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0]));

答案 1 :(得分:2)

这是因为参数是传入的所有参数。您应该使用arr而不是参数。

var moveZeros = function (arr) {
  var args = arr;
  ...
}

您将面临的另一个问题是,当您从开始循环到结束并将元素移动到结尾时,您将跳过索引,因为东西向下滑动以填充您刚刚创建的孔。如果使用for循环,则应该使用reduce()或从结尾循环到开头。

var moveZeros = function(arr) {
  var args = arr;
  for (var i = args.length - 1; i >= 0; i--) {
    if (args[i] === 0) {
      args.splice(i, 1);
      args.push(0);
    }
  }
  return args;
}

console.log(JSON.stringify(moveZeros([1, 2, 0, 1, 0, 1, 0, 3, 0, 1])));

答案 2 :(得分:2)

您可以使用arr的副本并使用变量进行长度检查。如果找到零,则长度变量递减,零被推到最后。如果未找到,则索引会递增。

var moveZeros = function (arr) {
    var args = arr.slice(),
        i = 0,
        l = args.length;

    while (i < l) {
        if (args[i] === 0) {
            args.push(args.splice(i, 1)[0]);
            l--;
        } else {
            i++;
        }
    }
    return args;
}

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

或者从最后使用循环。

var moveZeros = function (arr) {
    var args = arr.slice(),
        i = args.length;

    while (i--) {
        if (args[i] === 0) {
            args.push(args.splice(i, 1)[0]);
        }
    }
    return args;
}

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

答案 3 :(得分:1)

您必须在splice()方法中提供count个要删除的值。

仅当值为0时才推送0。你每次都在推动它。 (提示:因为push语句不在if)。

使用数组副本:

您可以维护一个新数组并仅将非zzero值推送到它,然后推送所有零。简单易懂。

&#13;
&#13;
var moveZeros = function(args) {
  var arr = [], zCount = 0;
  for (var i = 0; i < args.length; i++) {
    args[i] == 0 ? zCount++ : arr.push(args[i]);
  }
  while (zCount-- > 0) arr.push(0);
  console.log(arr);
  return arr;
}
JSON.stringify(moveZeros([9, 0, 0, 0, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0]));
&#13;
&#13;
&#13;

使用反向循环: 你需要一个反向循环,因为每次拼接时你都会跳过一个索引,所以不会删除重复的0。

&#13;
&#13;
var moveZeros = function(args) {
  for (var i = args.length; i > 0; i--) {
    if (args[i] == 0) {
      args.splice(i, 1);
      args.push(0);
    }
  }
  console.log(args);
  return args;
}
JSON.stringify(moveZeros([9, 0, 0, 0, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0]));
&#13;
&#13;
&#13;

答案 4 :(得分:1)

我认为这将是最有趣的方式,最好的代码行和使用内置函数(排序)然后它面临更少的性能问题。

&#13;
&#13;
var array = [1, 2, 0, -1, 0, 1, 0, 3, 0, 1]
array.sort(a => a === 0);
console.log(array);
&#13;
&#13;
&#13;

答案 5 :(得分:0)

首先在迭代它时修改数组是不好的。这可能会导致一些令人困惑的奇怪跳跃。 说你有1,0,0,1 在你的循环中,当你得到索引1时,它将拼接并将零附加到数组的末尾 1,0,1,0 但计数器将增加到2,它将错过现在位置1的0。

看起来你正试图用

创建一个浅表副本
var args = Array.prototype.slice.call(arguments);

但我不太确定。 我不会修改你想要返回的数组,而是创建一些临时数组并循环输入,如果它的0为某个计数器,如果它不是0将其推送到保持数组,则推送尽可能多的0。计数器告诉你并返回临时数组