Suponga que hay una matriz anidada como esta:
[ [ 'one', 'third ], [ 'one', 'second', 'fourth' ], [ 'one', 'third' ], ]
Necesito hacer que los valores sean únicos por orden de prioridad: si existe un elemento en la primera matriz, debe eliminarse de la segunda y la tercera. Un elemento de la segunda matriz no debería existir en la tercera.
Así que el resultado debería ser:
[ [ 'one', 'third ], [ 'second', 'fourth' ], [], ]
Repetiría sobre cada matriz y cada elemento, pero esto elimina un elemento solo de la siguiente matriz (a la que le falta la última matriz o errores si el ciclo está en la última matriz) y se siente muy raro...
for (let i = 0; i < array.length; i++) { const element = array[i]; for (let j = 0; j < element.length; j++) { const string = element[j]; const index = array[i + 1].indexOf(string) if (index !== -1) { array[i + 1].splice(index, 1) } } }
Puede tomar un Set
y filtrar los valores con una búsqueda y agregar el valor, si no se ve.
const values = new Set, data = [['one', 'third'], ['one', 'second', 'fourth'], ['one', 'third']], result = data.map(a => a.filter(v => !values.has(v) && values.add(v))); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Esto se puede hacer a través de un proceso de dos pasos:
Set
en cada sub-arreglo para eliminar cualquier elemento duplicado.filter()
y .some .some()
para iterar a través de cada elemento de cada subarreglo y omitir (filtrar) cualquiera que esté en cualquier subarreglo de índice inferior. El primer subarreglo, índice 0, se devuelve completo, ya que no hay subarreglos de índice inferior con los que comparar. const data = [[ 'one', 'third'],[ 'one','second','fourth'], ['one', 'third']]; const result = data.map(arr => [...new Set(arr)]).map( (arr,i,a) => i === 0 ? arr : arr.filter( v => !a.slice(0,i).some(x => x.includes(v)) ) ); console.log( result );
Un enfoque inmutable, usando reduce()
y flat()
:
const data = [[ 'one', 'third' ], [ 'one', 'second', 'fourth' ],[ 'one', 'third' ]]; const result = data.reduce((acc, val) => [ ...acc, val.filter(item => !acc.flat().includes(item)) ], []); console.log(result);