Почему массив не повторяется при уменьшении - PullRequest
2 голосов
/ 26 апреля 2019

Я хочу разделить массив на четные и нечетные элементы, это мой код

A.reduce((a,v,i)=> v % 2 == 0 ? [...a[0],v] : [...a[1],v],[[],[]])

A - массив чисел. Я не понимаю, почему я получаю ошибку

a [1] не повторяется?

Учитывая, что этот код работает нормально:

let arr = [[],[]];
console.log([...arr[1], 4]);

Ответы [ 4 ]

2 голосов
/ 26 апреля 2019

Вы возвращаете только один массив в reduce().Вам также необходимо вернуть второе.На первой итерации a равно [[],[]].Но после первого он станет только одним массивом.

let A = [1,2,3,4]
const res= A.reduce((a,v,i)=> v % 2 == 0 ? [a[0],[...a[1],v]] : [[...a[0],v],a[1]],[[],[]])
console.log(res)

Вы можете использовать трюк здесь.Как v % 2 вернет 1 или 0, так что вы можете push() к этому и использовать , для возврата оригинала a без оператора спреда.

let A = [1,2,3,4]
const res= A.reduce((a,v,i)=> (a[v % 2].push(v),a),[[],[]])
console.log(res)
0 голосов
/ 26 апреля 2019

Проблема с вашим решением состоит в том, что в функции Reduce вы возвращаете один массив из множества элементов (не один массив с двумя массивами). Попробуйте это вместо этого (где B = [[], []], сложность времени n )

A.forEach(x=> B[x%2].push(x) )

let A=[1,2,3,4,5,6,7], B=[ [],[] ];
A.forEach(x=> B[x%2].push(x) );

console.log(B);
0 голосов
/ 26 апреля 2019

Вы также можете просто отфильтровать дважды:

  const res = [A.filter(it => it % 2), A.filter(it => !(it % 2))];
0 голосов
/ 26 апреля 2019

Вы можете использовать назначение деструктуры, чтобы сделать это немного легче -

const data =
  [ 1, 2, 3, 4 ]

const result =
  data.reduce
    ( ([ odd, even ], v) =>
        Boolean (v & 1)
          ? [ [...odd, v], even ]
          : [ odd, [...even, v] ]
    , [ [], [] ]
    )
    
console.log(result)
// [ [ 1, 3 ], [ 2, 4 ] ]

Вы можете сделать универсальную функцию, partition -

const partition = (p, a = []) =>
  a.reduce
    ( ([ t, f ], v) =>
        p (v)
          ? [ [...t, v], f ]
          : [ t, [...f, v] ]
    , [ [], [] ]
    )


const evenOdds =
  partition (v => Boolean (v & 1), [ 1, 2, 3, 4 ])

const lessThan2 =
  partition (v => v < 2, [ 1, 2, 3, 4 ])
    
console.log(evenOdds)
// [ [ 1, 3 ], [ 2, 4 ] ]

console.log(lessThan2)
// [ [ 1 ], [ 2, 3, 4 ] ]
...