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));
À 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 0
et a.lastIndexOf(2)
donnera 6
. Comme 0 !== 6
est vrai, l'élément 2
est 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 0
et a.lastIndexOf(6)
sera encore nous donner 6
. Comme ceux - ci ne sont pas égaux , vous aurez true
et de garder à 2
nouveau 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);