Necesito encontrar cualquier diferencia entre dos matrices en los elementos e insertar dichos elementos en una nueva matriz que luego se devuelve al final. He extraído una función de este sitio web mediante una búsqueda que tiene el propósito de contar la cantidad de veces que un elemento ocurre en una matriz y devolverlo. Primero he concatenado las dos matrices juntas, luego apliqué esta función (la modifiqué para adaptarme a mi problema lo mejor que pude). Luego intenté enviar los elementos que eran diferentes (no ocurrieron dos veces) a la nueva matriz. Mi código, por supuesto, no funciona y también soy nuevo en Javascript, así que por favor sé amable conmigo.

A continuación hay un código de lo que he intentado, que no pasa ninguna prueba:

function diffArray(arr1, arr2) {
  var newArr = [];

  let tempArr = arr1.concat(arr2);

  function countInArray(array, what) {
    var count = 0;
    for (var i = 0; i < array.length; i++) {
        if (array[i] === what) {
            count++;
        }
    }
    if (countInArray(tempArr, tempArr[i]) < 2) {
      newArr.push(tempArr[i]);
    } 
}


  return newArr;
}

Si proporciona algún código, intente descifrarlo para que pueda entenderlo mejor y aprender.

-1
Oversought 10 may. 2019 a las 22:54

3 respuestas

La solución más elegante que pude encontrar se indica usando ES7 aparentemente. Lo publicaré a continuación, pero si alguien pudiera ayudarme a descubrir cómo hacer que mi código inicial funcione, se lo agradecería.

function diffArray(arr1, arr2) {

let difference = arr1
                 .filter(x => !arr2.includes(x))
                 .concat(arr2.filter(x => !arr1.includes(x)));


  return difference;
}

Básicamente, esto filtra la primera matriz en función de lo que la segunda no tiene y concatena en la segunda matriz filtrada en función de lo que no ocurre en la primera. Por lo tanto, obtiene ambos lados, no solo uno, por lo tanto, 'simétrico'.

0
Oversought 10 may. 2019 a las 20:26

Invierta la segunda matriz y probablemente eso debería facilitar su tarea

Array. Método inverso: http://www.w3schools.com/jsref/jsref_reverse.asp

0
Farhan 10 may. 2019 a las 20:00

Puede tomar un Set

El objeto Set le permite almacenar valores únicos de cualquier tipo, ya sean valores primitivos o referencias de objetos.

Y devuelve la diferencia del lado izquierdo y derecho.

function getSymDifference(a, b) {
    return getDifference(a, b).concat(getDifference(b, a));
}

function getDifference(a, b) {
    var setB = new Set(b);
    return a.filter(v => !setB.has(v));
}

console.log(getSymDifference(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"])); // ["pink wool"]
console.log(getSymDifference([1, "calf", 3, "piglet"], [7, "filly"])); // [1, "calf", 3, "piglet", 7, "filly"]
console.log(getSymDifference([], ["snuffleupagus", "cookie monster", "elmo"]));
console.log(getSymDifference([1, 2, 3, 5], [1, 2, 3, 4, 5]));

Un enfoque clásico al empalmar la matriz para evitar el uso de elementos ya visitados o buscados para usar nuevamente.

function getSymDifference(a, b) {
    var aa = a.slice(),
        bb = b.slice(),
        result = [],
        i, j;

    for (i = 0; i < aa.length; i++) {
        j = bb.indexOf(aa[i]);
        if (j === -1) {
            result.push(aa[i]);
        } else {
            bb.splice(j, 1);
        }
    }
    return result.concat(bb);
}

console.log(getSymDifference(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"])); // ["pink wool"]
console.log(getSymDifference([1, "calf", 3, "piglet"], [7, "filly"])); // [1, "calf", 3, "piglet", 7, "filly"]
console.log(getSymDifference([], ["snuffleupagus", "cookie monster", "elmo"]));
console.log(getSymDifference([1, 2, 3, 5], [1, 2, 3, 4, 5]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 10 may. 2019 a las 20:26