Tengo una matriz que contiene matrices anidadas que se crean dinámicamente, se ve así:
[['1', '2'],['1','3', '4'],['1', '3']] Estoy tratando de implementar la lógica AND obteniendo solo valores duplicados de estas matrices. Mi salida esperada aquí sería ['1'] ya que todas las matrices anidadas deben contener el mismo valor.
// [['1', '2'],['1','3', '4'],['1', '3']] const arrays = [...new Set(response)].filter(newSet => newSet.length > 0); const builder = []; // array of all the id's no longer needed // [[],[],[]] arrays.forEach(arr => { // [] arr.forEach(value => { // [[], [], []] const found = arrays.filter(a => a.find(v => v === value)); if (found.length === 0) builder.push(value); }); }); console.log(builder); // empty [] Esto me da una matriz vacía debido al filter() . ¿Cómo podría devolver una matriz de valores que contienen todas las matrices (3 en este caso, pero podrían ser más)?
El resultado esperado con la entrada anterior sería ["1"] . Cualquier ayuda apreciada.
por lo que entiendo, necesitas los elementos comunes de toda la matriz
let response1 = [['1', '2'],['1','3', '4'],['1', '3']] let response2 = [['1', '2', '3'],['1','3', '4'],['1', '3']] const getCommon = res => [...new Set(res.flat())].filter(a => res.every(c => c.includes(a))); console.log(getCommon(response1)) console.log(getCommon(response2)) ACTUALIZAR Aparentemente, la transformación establecida es innecesaria ya que de todos modos tiene que dar los elementos comunes a cada matriz, por lo que el filtrado de res[0] debería ser suficiente
let response1 = [['1', '2'],['1','3', '4'],['1', '3']] let response2 = [['1', '2', '3'],['1','3', '4'],['1', '3']] const getCommon = res => res[0].filter(a => res.every(c => c.includes(a))); console.log(getCommon(response1)) console.log(getCommon(response2))Puede crear un objeto de conteo que tenga la frecuencia de cada número y simplemente verificar si la frecuencia de un número es igual a la longitud de la matriz original.
const getIntersectVals = (arrayOfVals)=>{ const freqs = {}; for(let arr of arrayOfVals){ for(let val of arr){ if(freqs[val]) freqs[val]++; else freqs[val] = 1; } } const uniqueVals = Object.keys(freqs); const correctVals = uniqueVals.filter(elem=>{ return freqs[elem] === arrayOfVals.length; }) return correctVals; } const arrayOfVals = [['1', '2'],['1','3', '4'],['1', '3']]; console.log(getIntersectVals(arrayOfVals))Intersección de Lodash si no te importa
const arrayOfVals = [['1', '2'],['1','3', '4'],['1', '3']]; const result = _.intersection(...arrayOfVals); console.log(result); .as-console-wrapper{min-height: 100%!important; top: 0} <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>