разбить массив на два массива по нечетной / четной позиции - PullRequest
15 голосов
/ 14 ноября 2011

У меня есть массив Arr1 = [1,1,2,2,3,8,4,6].

Как я могу разбить его на два массива в зависимости от четности / четности позиций элементов?

subArr1 = [1,2,3,4]
subArr2 = [1,2,8,6]

Ответы [ 10 ]

18 голосов
/ 14 ноября 2011
odd  = arr.filter (v) -> v % 2
even = arr.filter (v) -> !(v % 2)

Или в более идиоматическом CoffeeScript:

odd  = (v for v in arr by 2)
even = (v for v in arr[1..] by 2)
16 голосов
/ 14 ноября 2011

Вы можете попробовать:

var Arr1 = [1,1,2,2,3,8,4,6],
    Arr2 = [],
    Arr3 = [];

for (var i=0;i<Arr1.length;i++){
    if ((i+2)%2==0) {
        Arr3.push(Arr1[i]);
    }
    else {
        Arr2.push(Arr1[i]);
    }
}

console.log(Arr2);

JS Fiddle demo .

4 голосов
/ 14 ноября 2011

Было бы проще использовать вложенные массивы:

result = [ [], [] ]

for (var i = 0; i < yourArray.length; i++)
    result[i & 1].push(yourArray[i])

, если вы ориентируетесь на современные браузеры, вы можете заменить цикл на forEach:

yourArray.forEach(function(val, i) { 
    result[i & 1].push(val)
})
3 голосов
/ 14 ноября 2011

Функциональный подход с использованием подчеркивания :

xs = [1, 1, 2, 2, 3, 8, 4, 6]
partition = _(xs).groupBy((x, idx) -> idx % 2 == 0)
[xs1, xs2] = [partition[true], partition[false]]

[править] Теперь есть _. Раздел :

[xs1, xs2] = _(xs).partition((x, idx) -> idx % 2 == 0)
1 голос
/ 09 июня 2016
var Arr1 = [1, 1, 2, 2, 3, 8, 4, 6]
var evenArr=[]; 
var oddArr = []

var i;
for (i = 0; i <= Arr1.length; i = i + 2) {
    if (Arr1[i] !== undefined) {
        evenArr.push(Arr1[i]);
        oddArr.push(Arr1[i + 1]);
    }
}
console.log(evenArr, oddArr)
0 голосов
/ 27 октября 2016

filters - это нестатический и не встроенный метод Array, который принимает literal object функций фильтров и возвращает literal object массивов, где вход и выход отображаются с помощью клавиш объекта.

    Array.prototype.filters = function (filters) {
      let results = {};
      Object.keys(filters).forEach((key)=>{
         results[key] = this.filter(filters[key])   
      }); 
      return results;
    }
    //---- then : 
    
    console.log(
      [12,2,11,7,92,14,5,5,3,0].filters({
        odd:  (e) => (e%2),
        even: (e) => !(e%2)
      })
    )
0 голосов
/ 11 июля 2014

В качестве однострочного улучшения решения Tokland с использованием функции подчеркивания:

xs = [1, 1, 2, 2, 3, 8, 4, 6]
_(xs).chain().groupBy((x, i) -> i % 2 == 0).values().value()
0 голосов
/ 14 ноября 2011

Просто для удовольствия, в две строки, учитывая, что это было помечено coffeescript:

Arr1 = [1,1,2,2,3,8,4,6]

[even, odd] = [a, b] = [[], []]
([b,a]=[a,b])[0].push v for v in Arr1

console.log even, odd
# [ 1, 2, 3, 4 ] [ 1, 2, 8, 6 ]
0 голосов
/ 14 ноября 2011

Метод без оператора по модулю:

var subArr1 = [];
var subArr2 = [];
var subArrayIndex = 0;
var i;
for (i = 1; i < Arr1.length; i = i+2){
    //for even index
    subArr1[subArrayIndex] = Arr1[i];
    //for odd index
    subArr2[subArrayIndex] = Arr1[i-1];
    subArrayIndex++;
}
//For the last remaining number if there was an odd length:
if((i-1) < Arr1.length){
    subArr2[subArrayIndex] = Arr1[i-1];
}
0 голосов
/ 14 ноября 2011

Полагаю, вы можете сделать 2 для циклов, которые увеличиваются на 2 и в первом цикле начинаются с 0, а во втором цикле начинаются с 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...