0
votes

javascript recherche des valeurs uniques de tous les tableaux du tableau

J'ai ce tableau de tableaux: [['RF1', 'FF1'], ['FF1'], ['FF1']]

J'essaie de déstructurer et de réduire jusqu'à des valeurs uniques ['FF1', 'RF1'] (l'ordre n'a pas d'importance).

J'ai essayé quelque chose que j'ai trouvé ici , avec la fonction suivante.

jointArray [ [ 'RF1', ' FF1' ], [ 'FF1' ], [ 'FF1' ] ]
unique [ [ 'RF1', ' FF1' ], [ 'FF1' ], [ 'FF1' ] ]

et il renvoie exactement ce que je mets, que me manque-t-il ici?

const merge = (...arrays) => {
    let jointArray = [];
    arrays.forEach(arr => {
        jointArray = [...jointArray, ...arr];
    });
    console.log('jointArray', jointArray);
    const unique = jointArray.filter((item, index) => jointArray.indexOf(item) === index);
    console.log('unique', unique);
    return unique;
}

let arr = [ [ 'RF1', ' FF1' ], [ 'FF1' ], [ 'FF1' ] ];
merge(arr);


7 commentaires

en gros, c'est new Set (a.flat ()) en javascript moderne


@georg: oui, peut-être enveloppé dans [...] . Mais seulement parce que les valeurs sont primitives. Si vous avez besoin d'une égalité de valeur pour un non-primitif, le Set ne vous aidera pas.


@ScottSauyet qu'en est-il de cette question qui vous suggère que les non-primitifs sont impliqués ...?


@PatrickRoberts: Rien de particulier, mais lorsque certaines personnes posent une question, elles simplifient souvent les données. Ils ont peut-être pris leur utilisateur ou d'autres objets et en ont fait des chaînes pour qu'il soit plus facile de demander brièvement. Ceci est encouragé, en fait. Ensuite, ils devraient revenir pour demander pourquoi cela ne fonctionne toujours pas avec les données pertinentes. Ce n'est peut-être pas du tout le cas ici, mais j'ai vu plusieurs conversations de ce type impliquant des instances Set et Map .


@shaun: D'autres vous proposent de très bonnes alternatives. Mais la raison pour laquelle cela ne fonctionne pas pour vous, c'est parce que cette version de merge prend des arguments séparés plutôt qu'un tableau d'entre eux. Si vous supprimez ... du paramètre, cela devrait simplement fonctionner: const merge = (... arrays) => {...} => const merge = (tableaux) => {...} .


Consultez ma réponse qui n'utilise pas flat () : stackoverflow.com/a/57896833/2924577 < / a>.


Si vous pensez qu'une des réponses a répondu à votre question, pensez à la marquer comme acceptée pour le bénéfice des futurs lecteurs. Plus d'informations: stackoverflow.com/help/someone-answers .


3 Réponses :


1
votes

Vous pouvez flat array et ensuite utiliser set

let arr = [
  ['RF1', ' FF1'],
  ['FF1'],
  ['FF1']
]

let flaten = arr.flat().map(a => a.trim())
let newSet = new Set(flaten)

console.log([...newSet])

Si vous voulez traiter les espaces de début et de fin de manière insignifiante, vous pouvez boucler et découper après aplatissement du tableau

let arr = [
  ['RF1', ' FF1'],
  ['FF1'],
  ['FF1']
]

let flaten = arr.flat()
let newSet = new Set(flaten)

console.log([...newSet])


2 commentaires

J'exécute le nœud v10.15.3, je continue juste à obtenir .flat n'est pas une fonction quoi que ce soit de plus que je puisse faire?


@shaun si cette version ne prend pas en charge flat , vous pouvez utiliser des alternatives Fusionner / aplatir un tableau de tableaux



-1
votes
var arr = [ [ 'RF1', ' FF1' ], [ 'FF1' ], [ 'FF1' ] ]
var myArray = arr.flat(Infinity);;
var uniq = [...new Set(myArray)];

0 commentaires

0
votes

Vous pouvez parcourir tous les éléments et les ajouter à un Définissez , puis convertissez-le en tableau en utilisant Array.from () .

var data = [ [ 'RF1', ' FF1' ], [ 'FF1' ], [ 'FF1' ] ];

var unique = new Set();

data.forEach(arr => {
  arr.forEach(value => {
    unique.add(value.trim());
  });
});

var result = Array.from(unique);

console.log(result);


0 commentaires