2
votes

Pourquoi le tableau n'est pas itérable dans la réduction

Je veux diviser le tableau par des éléments pairs et impairs, c'est mon code

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

Un est un tableau de nombres. Je ne comprends pas pourquoi j'obtiens une erreur

a [1] n'est pas itérable?

Considérant que ce code fonctionne bien:

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


7 commentaires

À quoi ressemble le tableau A ?


@VasilDininski, j'ai ajouté dans le post


arr.reduce ... fonctionne très bien, avec votre fonction de réduction et votre définition d'arr. Il semble que vous ayez défini A comme un tableau 1d.


Une fois que vous avez effectué une itération, vous avez réparti l'original a [0] ou a [1] dans le tableau de résultats, de sorte que l'accumulateur n'est plus un Tableau 2D.


Sur une note latérale, pensez-vous que cette seule doublure est lisible? :)


Le tableau "A" doit être une chaîne / un objet / un tableau ou tout autre élément itérable. Je pense que vos composants au niveau du tableau ne sont pas itérables. Vérifiez votre instance de tableau.


@Icepickle, je jouais juste sur leetcode, pas pour la production


4 Réponses :


2
votes

Vous ne renvoyez qu'un seul tableau dans reduction () . Vous devez également renvoyer le second. Dans la première itération, le a est [[], []] . Mais après le premier, il ne deviendra qu'un seul tableau.

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

Vous pouvez utiliser une astuce ici. Comme v% 2 renverra 1 ou 0 afin que vous puissiez pousser () vers cela et utiliser , pour renvoyer le a d'origine sans opérateur de propagation.

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)


0 commentaires

0
votes

Vous pouvez utiliser une affectation de déstructuration pour rendre cela un peu plus facile -

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

Vous pouvez créer une fonction générique, partition -

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


1 commentaires

... euh même basé sur la valeur pas sur l'index, non?



0
votes

Vous pouvez également filtrer deux fois:

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


0 commentaires

0
votes

Le problème avec votre solution est que dans la fonction de réduction, vous retournez un tableau de nombreux éléments (pas un tableau avec deux tableaux). Essayez plutôt ceci (où B = [[], []], complexité temporelle n )

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

console.log(B);

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


0 commentaires