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],[[],[]])
4 Réponses :
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)
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 ] ]
... euh même basé sur la valeur pas sur l'index, non?
Vous pouvez également filtrer deux fois:
const res = [A.filter(it => it % 2), A.filter(it => !(it % 2))];
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) )
À 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éfiniA
comme un tableau 1d.Une fois que vous avez effectué une itération, vous avez réparti l'original
a [0]
oua [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