我想按顺序将数组分成两组(奇数组和偶数组)。但是当我尝试这个时:
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/