Tengo 2 matrices que estoy tratando de comparar y obtener los valores únicos de:
arr1 = [ 'Material', 'Style', 'Size', 'add another item', 'THIS IS A TEST OPTION', 'Title', 'Color', 'dfgdfs', 'teststststst', 'THIS IS A NEW OPTION' ] arr2 = [ { option: 'Title', product: [ [Object] ] }, { option: 'Style', product: [ [Object] ] }, { option: 'Material', product: [ [Object] ] }, { option: 'Size', product: [ [Object], [Object] ] }, { option: 'Color', product: [ [Object], [Object] ] }, { option: 'THIS IS A NEW OPTION', product: [ [Object] ] }, { option: 'THIS IS A TEST OPTION', product: [ [Object] ] }, { option: 'add another item', product: [ [Object] ] } ]
Rendimiento esperado:
['dfgdfs','teststststst']
No tengo ningún problema en extraer valores únicos cuando las matrices tienen 1 nivel de profundidad. Sin embargo, tengo problemas con arr2
como una matriz de objetos.
He intentado:
arr1 = arr1.filter(val => !arr2.includes(val));
Lo que obviamente no funciona porque arr2
es una matriz de objetos.
También he intentado:
arr1.filter((val, index) => { if (arr2[index]) { !arr2[index].option.includes(val); } });
Tanto como:
arr1.filter((val, index) => { allUniqueOptions.forEach((option) => { !option.option.includes(val); }); });
Esto parece que debería ser tan simple, pero he estado devanándome la cabeza durante horas. ¿Alguna idea de lo que estoy haciendo mal?
Sus funciones de filtro deben devolver verdadero si se va a incluir el elemento y falso si no. Tenga en cuenta que sus dos últimos ejemplos no devuelven nada.
La lógica que utilicé en la función de filtro es: ¿aparece el elemento actual como una propiedad de "opción" en arr2? si sí devuelve falso, si no devuelve verdadero.
arr1 = [ 'Material', 'Style', 'Size', 'add another item', 'THIS IS A TEST OPTION', 'Title', 'Color', 'dfgdfs', 'teststststst', 'THIS IS A NEW OPTION' ] arr2 = [ { option: 'Title', product: {}}, { option: 'Style', product: {} }, { option: 'Material', product: {} }, { option: 'Size', product: {} }, { option: 'Color', product: {} }, { option: 'THIS IS A NEW OPTION', product: {} }, { option: 'THIS IS A TEST OPTION', product: {} }, { option: 'add another item', product: {} } ] const uniques = arr1.filter(item => !arr2.find(el => el.option === item)); console.log(uniques);
Necesita filter
el arr1
y verificar con some
método en cada elemento de la matriz si no existen iguales en las opciones de arr2.
const arr1 = [ 'Material', 'Style', 'Size', 'add another item', 'THIS IS A TEST OPTION', 'Title', 'Color', 'dfgdfs', 'teststststst', 'THIS IS A NEW OPTION' ] const arr2 = [ { option: 'Title', product: [ [ {} ] ] }, { option: 'Style', product: [ [ {} ] ] }, { option: 'Material', product: [ [ {} ] ] }, { option: 'Size', product: [ [ {} ], [ {} ] ] }, { option: 'Color', product: [ [ {} ], [ {} ] ] }, { option: 'THIS IS A NEW OPTION', product: [ [ {} ] ] }, { option: 'THIS IS A TEST OPTION', product: [ [ {} ] ] }, { option: 'add another item', product: [ [ {} ] ] } ] const result = arr1.filter(i => !arr2.some(o => i === o.option)) console.log(result)
Para agregar a las respuestas anteriores.
Otra razón por la que sus filtros no funcionaron es porque
arr2[índice] saldrá del rango.
arr1 tenía más índices que arr2