为什么数组在reduce中不可迭代

时间:2019-04-26 15:04:19

标签: javascript arrays reduce

我想用偶数和奇数元素拆分数组,这是我的代码

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 个答案:

答案 0 :(得分:2)

您只返回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将返回10,因此您可以push()并使用,来返回原始的a,而无需扩展运算符。

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

答案 1 :(得分:0)

您可以使用解构分配使此操作更容易-

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 ] ]

答案 2 :(得分:0)

您还可以过滤两次:

  const res = [A.filter(it => it % 2), A.filter(it => !(it % 2))];

答案 3 :(得分:0)

解决方案的问题在于,在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);