【问题标题】:Why array is not iterable in reduce为什么数组在reduce中不可迭代
【发布时间】:2019-04-26 15:04:18
【问题描述】:

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

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 数组长什么样子?
  • @VasilDininski,我在帖子中添加了
  • arr.reduce... 工作正常,您的 reduce 函数和 arr 定义。似乎您很可能已将 A 定义为一维数组。
  • 经过一次迭代后,您已将原始a[0]a[1] 展开到结果数组中,因此累加器不再是二维数组。
  • 在旁注中,您认为这一行是可读的吗? :)

标签: javascript arrays reduce


【解决方案1】:

您只返回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)

【讨论】:

    【解决方案2】:

    你也可以只过滤两次:

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

    【讨论】:

      【解决方案3】:

      您可以使用解构赋值使这更容易一些 -

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

      【讨论】:

      • ...嗯,即使基于不在索引上的值对吗?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-21
        • 1970-01-01
        相关资源
        最近更新 更多