我想按顺序将一个数组与两个组(奇数和偶数)分开。但是当我尝试这个时:
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);
&#13;
console.log(arr);
// [1, 3, 5, 7, 9, 4, 8, 6, 2]
为什么4,8,6,2而不是2,4,6,8?
答案 0 :(得分:0)
你这样做很复杂。您可以使用array.prototype.filter
和array.prototype.concat
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr = arr.filter(e => e%2).concat(arr.filter(e => e%2 === 0));
console.log(arr);
答案 1 :(得分:0)
为什么4,8,6,2而不是2,4,6,8?
基本上,当完成一半的迭代时,重新处理推送的项目。
您需要将for循环更改为
<xsl:param name="format" select="'h:mm:ss a'"/>
<强>演示强>
for (var i = 0; i < arr.length/2; i++) {
if (arr[i]%2 == 0) {
arr.push(arr.splice(i, 1)[0]);
}
}
&#13;
修改强>
如果项目的顺序并不总是排序,那么除了先排序之外,你可以减少var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
for (var i = 0; i < arr.length / 2; i++) {
if (arr[i] % 2 == 0) {
arr.push(arr.splice(i, 1)[0]);
}
}
console.log(arr);
变量。
length
答案 2 :(得分:0)
因为您将每个找到的偶数值移动到数组的末尾:
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
,因为它永远不会被检查并停留在这个地方,以及其他实际上不均匀的值。你甚至可以在数组的开头再次尝试整个,比如
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);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
您可以使用长度进行检查,并减少每个找到的偶数值的长度。在这种情况下,索引保持在该值,因为索引现在是检查的下一个元素。
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);
&#13;
或者只是排序。
将奇数值移至顶部,然后按值排序。
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
array.sort((a, b) => b % 2 - a % 2 || a - b);
console.log(array);
&#13;
答案 3 :(得分:0)
为什么4,8,6,2而不是2,4,6,8?
这是因为您正在修改正在循环的相同数组。 为了更好地理解,让我们循环你的代码
after
1st Loop: array: [1, 2, 3, 4, 5, 6, 7, 8, 9];
2nd loop: array: [1, 3, 4, 5, 6, 7, 8, 9, 2];
3rd loop: array: [1, 3, 5, 6, 7, 8, 9, 2, 4];
4th loop: array: [1, 3, 5, 7, 8, 9, 2, 4, 6];
5th loop: array: [1, 3, 5, 7, 9, 2, 4, 6, 8];
6th loop: array: [1, 3, 5, 7, 9, 4, 6, 8, 2];
7th loop: array: [1, 3, 5, 7, 9, 4, 8, 2, 6];
8th loop: array: [1, 3, 5, 7, 9, 4, 8, 6, 2];
9th loop: array: [1, 3, 5, 7, 9, 4, 8, 6, 2];
将数组中的奇数/偶数分开,
我们将不得不单独过滤奇数和偶数,并在evenArray
(过滤后的数组)的末尾推送oddArray
var input = [1, 2, 3, 4, 5, 6, 7, 8, 9];
input = input.sort((a, b)=> a-b); //to sort array if not sorted already
var evenArr = [];
input = input.filter(item => {
if (item % 2 != 0)
return true
else {
evenArr.push(item);
return false;
}
})
Array.prototype.push.apply(input, evenArr);
console.log(input);
&#13;
答案 4 :(得分:0)
我相信lodash _.partition
可以解决这个问题:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var [odds, evens] = _.partition(arr, function(n) {
return n % 2;
});
console.log(_.concat(odds, evens));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
或更短:
_.groupBy(arr, function(n) {return (n % 2) ? 'odd' : 'even';})