0
votes

Renvoyer une matrice étamée dans la fonction de flèche

Supposons que j'ai ce type de tableau:

[[[1, 2], [3, 4]]

Ce que je dois faire est d'obtenir éléments imbriqués sur la couche supérieure, à ressembler à:

[1, 2, 3, 4]

J'essaie d'atteindre ça dans manière fonctionnelle, le code ressemble donc à ceci: xxx

mais qui figure avec jeton inattendu ... erreur. Alors, quelle est la façon de le faire correctement?


4 commentaires

Il y a array.pototype.flat < / code> . Regardez son Polyfills .


Les éléments imbriqués seront-ils toujours des matrices?


Votre confusion découle du fait que la syntaxe de diffusion n'est pas un opérateur. C'est une syntaxe contextuelle.


@Xufox merci pour ça! Appartement Cela me semble très bien.


3 Réponses :


5
votes

Vous pouvez utiliser la méthode plate code> de tableau:

p>

const inp = [[1,2], [3,4]];
console.log(inp.reduce((acc, val) => acc.concat(...val), []));


5 commentaires

Il convient probablement de mentionner que cela ne fonctionne pas (actuellement) sur Edge, Internet Explorer ou Nœud.


@PatrickRoberts Quelle version utilisez-vous? ça marche depuis chrome 69


@PatrickRoberts Vous pouvez vérifier la compatibilité du navigateur ici: développeur.mozilla.org/en-us/docs/web/javascript/reference/...


Chrome prend également en charge platmap


Oh, j'ai eu un drapeau, c'était mon mauvais.



3
votes

array.from code> produira un élément pour chaque élément de la matrice passée. Il regarde la longueur code> de la transmission intimer et iterate sur les index à partir de 0. Donc, peu importe ce que vous faites dans le rappel (en supposant que ce soit valide), vous allez obtenir un tableau de la longueur 2 sortie si vous passez dans une matrice à deux éléments.

Réduire () code> est probablement une meilleure option ici: p>

p>

let arr = [ [1, 2], [3, 4] ]

let flat = arr.reduce((arr, item) => [...arr, ...item])
console.log(flat)


0 commentaires

1
votes

Vous pouvez créer un itérateur pour le tableau et propager la matrice en utilisant un autre générateur pour des tableaux imbriqués.

p>

function* flat() {
    for (var item of this.slice()) {
        if (Array.isArray(item)) {
            item[Symbol.iterator] = flat;
            yield* item
        } else {
            yield item;
        }
    }
}

var array = [[1, 2], [3, 4, [5, 6]]];

array[Symbol.iterator] = flat;

console.log([...array]);


1 commentaires

C'est plutôt cool. Il pourrait être plus agréable si plat () a pris le tableau en tant que paramètre et appelé récursivement afin d'éviter l'effet secondaire de la modification des sous-réseaux. Mais alors vous devriez appeler [... plat (tableau)]