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

3

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

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

A是数字数组。我不明白为什么会出现错误:

a[1]不可迭代?

考虑到这段代码能够正常运行:

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


A 数组长什么样? - Vasil Dininski
@VasilDininski,我在帖子中添加了 - ogbofjnr
1
一旦您完成了一次迭代,原始的 a[0]a[1] 就已经被扩展到结果数组中,因此累加器不再是一个二维数组。 - Pointy
1
顺便说一句,你认为这个一行代码易读吗? :) - Icepickle
数组"A"应该是一个字符串/对象/数组或任何可迭代的类型。我认为你在数组中的组件不是可迭代的。请检查你的数组实例。 - Franco Rabaglia
显示剩余2条评论
4个回答

3
您在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而不需要使用spread操作符。

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


0

你也可以进行两次过滤:

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

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


...根据值而不是索引进行排序,对吧? - Jonas Wilms

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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接