javascript 数字数组中的奇数和偶数分隔

标签 javascript sorting console

我想按顺序将数组分成两组(奇数组和偶数组)。但是当我尝试这个时:

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    
    for (var i = 0; i < arr.length; i++) {
      if (arr[i]%2 == 0) {
        arr.push(arr.splice(i, 1)[0]);
      }
    }
    
    console.log(arr);

console.log(arr); 
// [1, 3, 5, 7, 9, 4, 8, 6, 2]

为什么是 4,8,6,2 而不是 2,4,6,8?

最佳答案

因为您将找到的每个偶数移动到数组的末尾:

0: 1 2 3 4 5 6 7 8 9
     ^-------------v
1: 1 3 4 5 6 7 8 9 2   3 is not checked, because of the incremented index after splicing
       ^-----------v
2: 1 3 5 6 7 8 9 2 4   5 is not checked
         ^---------v
3: 1 3 5 7 8 9 2 4 6   7 is not checked
           ^-------v
4: 1 3 5 7 9 2 4 6 8   9 is not checked
             ^-----v
5: 1 3 5 7 9 4 6 8 2
               ^---v
6: 1 3 5 7 9 4 8 2 6
                 ^-v
7: 1 3 5 7 9 4 8 6 2
                   |
8: 1 3 5 7 9 4 8 6 2

但是,你不检查找到偶数之后的值,比如第0行的值3,因为它从来没有检查过,停留在这个地方,以及其他实际上不均匀的值.您甚至可以在数组的开头再次尝试使用 all,例如

var array = [2, 4, 6, 8, 1, 3, 5, 7, 9];
    
for (var i = 0; i < array.length; i++) {
    if (array[i] % 2 === 0) {
        array.push(array.splice(i, 1)[0]);
        console.log(i + ': ' + array.join(' '));
    }
}

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

解决方案

您可以使用一个长度来检查并减少每个找到的偶数值的长度。在这种情况下,索引保留在值处,因为索引现在是下一个要检查的元素。

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9],
    i = 0,
    l = array.length;

while (i < l) {
    if (array[i] % 2 === 0) {
        array.push(array.splice(i, 1)[0]);
        l--;
        continue;
    }
    i++;
}

console.log(array);

或者只是排序。

通过将奇数移到顶部,然后按值排序。

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9];

array.sort((a, b) => b % 2 - a % 2 || a - b);
console.log(array);

关于javascript 数字数组中的奇数和偶数分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48297234/

相关文章:

python - 如何对 Dask 数据框组中的值进行排序?

WPF ListView - 按嵌套属性排序

algorithm - 快速排序中的随机改组如何帮助提高代码效率?

xml - 使用控制台和文件附加器的非常简单的 log4j2 XML 配置文件

javascript - Mac OSx 使用 sh 将文本插入到创建的文件中

javascript - 找到某些/特定的换行符,同时忽略其他换行符

Javascript:生成和存储随机抽取而无需替换

linux - 如何删除控制台应用程序 (Linux) 中的打印字符?

javascript - 在 HTML5 Canvas 上创建立体 3D 图像

javascript - 每次回复后提交 RSVP 表格 - 需要为家人一起提交所有回复