javascript奇数甚至是数字数组中的分离

时间:2018-01-17 09:05:52

标签: 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);
&#13;
&#13;
&#13;

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

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

5 个答案:

答案 0 :(得分:0)

你这样做很复杂。您可以使用array.prototype.filterarray.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'"/>

<强>演示

&#13;
&#13;
for (var i = 0; i < arr.length/2; i++) {
  if (arr[i]%2 == 0) {
    arr.push(arr.splice(i, 1)[0]);
  }
}
&#13;
&#13;
&#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,因为它永远不会被检查并停留在这个地方,以及其他实际上不均匀的值。你甚至可以在数组的开头再次尝试整个,比如

&#13;
&#13;
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;
&#13;
&#13;

解决方案

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

&#13;
&#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;
&#13;
&#13;

或者只是排序。

将奇数值移至顶部,然后按值排序。

&#13;
&#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;
&#13;
&#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

&#13;
&#13;
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;
&#13;
&#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';})