En utilisant .filter () et .map () pour résoudre l'intersection de deux ensembles en Javascript

Pluie :

Je veux en savoir plus sur les fonctions JS .filter () et .map () ... donc je suis en train de les utiliser pour résoudre les éléments suivants:

J'ai un tableau avec deux éléments - deux listes séparées par des virgules des numéros:

let testArray = ["2, 3, 4, 7, 14", "1, 2, 4, 7, 18"];

Je veux trouver l'intersection de ces deux ensembles / éléments, et les retourner comme un tableau de nombres. (Ou une chaîne de caractères séparés par des virgules serait bien aussi).

Mon code de courant produit la sortie désirée, mais il a répété deux fois, à savoir

[ 2, 4, 7, 2, 4, 7 ]

et je ne suis pas encore sûr pourquoi. Toute aide serait appréciée:

let testArray = ["2, 3, 4, 7, 14", "1, 2, 4, 7, 18"];

function findTheIntersection(array) {
    let a = array.join();
    a = a.split(',').map(Number); //.map(String);
    return a.filter(function(x){
        return a.indexOf(x) !== a.lastIndexOf(x)
    });
}

console.log(findTheIntersection(testArray));
Parsons Nick:

À l' heure actuelle, .indexOf()toujours se référer à la première occurrence de l'élément donné, même lorsque vous êtes sur la dernière occurrence de l'élément donné, à l' aide indexOf()vous donnera l'indice de la première occurrence si elle est apparue plus tôt dans le tableau.

Par exemple:

 0  1  2  3  4   5  6  7  8  9
[2, 3, 4, 7, 14, 1, 2, 4, 7, 18]

Si vous êtes sur l' index 0 regardant élément 2, a.indexOf(2)donnera 0et a.lastIndexOf(2)donnera 6. Comme 0 !== 6est vrai, l'élément 2est maintenu. Maintenant , si nous avançons dans le tableau que nous avons fini par atteindre l' index 6. Si nous sommes sur indice 6 regardant élément 2, l' exécution a.indexOf(6)sera toujours donner 0et a.lastIndexOf(6)sera encore nous donner 6. Comme ceux - ci ne sont pas égaux , vous aurez trueet de garder à 2nouveau dans le cadre du résultat.

Au lieu de cela, vous voulez vérifier l'index réel de l'élément contre le dernier indice en utilisant l'argument de l' indice passé dans .filter():

let testArray = ["2, 3, 4, 7, 14", "1, 2, 4, 7, 18"];

function findTheIntersection(array) {
  let a = array.join();
  a = a.split(',').map(Number);

  return a.filter(function(x, i) {
    return i !== a.lastIndexOf(x)
  });
}

console.log(findTheIntersection(testArray));

Cependant, notez, ce code ne trouve pas l'intersection que vous avez besoin, il trouve tout simplement les doublons. Au lieu de cela, vous pouvez utiliser .reduce()et ne conserver dans l'accumulateur si elles apparaissent dans le tableau itéré courant en utilisant .filter()avec .includes():

const array = ["2, 3, 4, 7, 14", "1, 2, 4, 7, 18"];
const [first, ...arrs] = array.map(v => v.split(',').map(Number));

const res = arrs.reduce((acc, arr) => {
  return acc.filter(num => arr.includes(num))
}, first);

console.log(res);

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=320273&siteId=1
conseillé
Classement