Usando .Filter () y .map () para resolver la intersección de dos conjuntos en Javascript

lluvia:

Quiero aprender más acerca de las funciones de JS .Filter () y .map () ... así que estoy tratando de utilizarlos para resolver el siguiente:

Tengo una matriz con dos elementos - dos listas separadas por comas de los números:

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

Quiero encontrar la intersección de estos dos sistemas / elementos, y devolverlos como una serie de números. (O una cadena separada por comas estaría bien también).

Mi código actual produce la salida deseada, sino que se repite dos veces, es decir,

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

y aún no estoy seguro de por qué. Cualquier ayuda sería apreciada:

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));
Nick Parsons:

En la actualidad, .indexOf()siempre se referirá a la primera aparición del elemento dado, por lo que incluso cuando estás en la última aparición del elemento dado, utilizando indexOf()le dará el índice de la primera aparición si aparecía antes en la matriz.

Por ejemplo:

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

Si estás en el índice 0 mirando al elemento 2, a.indexOf(2)dará 0y a.lastIndexOf(2)le dará 6. Como 0 !== 6es cierto, el elemento 2se mantiene. Ahora bien, si nos movemos hacia arriba en la matriz que finalmente alcanzamos índice 6. Si estamos en el índice 6 mirando elemento 2, la realización a.indexOf(6)se siguen dando 0y a.lastIndexOf(6)todavía nos dará 6. Ya que estos no son iguales que obtendrá truey mantener 2de nuevo como parte del resultado.

En su lugar, desea comprobar el índice real del elemento contra el último índice utilizando el argumento pasado al índice .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));

Sin embargo, hacer la nota, este código no encuentra la intersección como sea necesario, simplemente se encuentra duplicados. En su lugar, puede utilizar .reduce()y sólo mantener los elementos en el acumulador si aparecen en la matriz actual utilizando iterada .filter()con .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);

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=320281&siteId=1
Recomendado
Clasificación