Necesito ayuda para averiguar cómo obtener valores únicos de una matriz de objetos en este formato. He revisado varios ejemplos, pero ninguno tenía los valores de una clave como matriz. Gracias de antemano por tu consejo.
Tengo una matriz JS con objetos complejos con algunos valores de objeto que son matrices:
let array = [ { key1: ["one","two","four"], key2: [1,2,4] }, { key1: ["two","four","six"], key2: [2,4,6] }, { key1: "nine", key2: 9 }, ];Quiero obtener los valores únicos para todas las claves en el objeto (para que sea compatible con cualquier estructura) y generar un resultado como este:
[ { key1: ["one","two","four", "six", "nine"], key2: [1,2,4,6,9] } ]Puedes probar esto:
let array = [ { key1: ["one","two","four"], key2: [1,2,4] }, { key1: ["two","four","six"], key2: [2,4,6] }, { key1: "nine", key2: 9 }, ]; let keys = [...new Set(array.flatMap(d => Object.keys(d)))]; let valuesAsObj = Object.fromEntries( keys.map(k => [ k, [... new Set(array.flatMap(d => d[k] ? d[k] : null).filter(v => v != null && v != undefined))] ]) ); let valuesAsArr = keys.map(k => [... new Set(array.flatMap(d => d[k] ? d[k] : null).filter(v => v != null && v != undefined))]) console.log(valuesAsObj); console.log(valuesAsArr);Lo abordé creando un Set para cada propiedad única y agregando todas las propiedades a ese conjunto.
let array = [ { key1: ["one","two","four"], key2: [1,2,4] }, { key1: ["two","four","six"], key2: [2,4,6] }, { key1: "nine", key2: 9 }, ]; const result = {}; array.forEach(a => { for (let key in a) { if (!result[key]) result[key] = new Set(); let v = a[key]; if (!Array.isArray(v)) v = [v]; v.forEach(result[key].add, result[key]); } }); console.log(result ); const overlyComplicatedResult = Object.entries(result).map(([key,val]) => ({[key]: [...val]})); console.log(overlyComplicatedResult); Personalmente, estoy satisfecho con los resultados en el formato intermedio que se almacenan en la variable de result , que es solo un objeto donde cada propiedad es una de las claves y el valor de cada propiedad es un Set de todos los valores distintos.
Pero, si realmente quiere transformar eso en su resultado demasiado complicado, donde tiene una matriz de objetos, cada uno con una sola propiedad, y los elementos únicos se almacenan en una matriz en lugar de un Set , entonces el código se proporciona arriba como un paso de transformación final usando Object.entries .
Podrías intentar algo como esto:
let array = [ { key1: ["one","two","four"], key2: [1,2,4] }, { key1: ["two","four","six"], key2: [2,4,6] }, { key1: "nine", key2: 9 }, ]; let obj = {}; array.forEach((item) => Object.entries(item).forEach((entry) => { if (!obj[entry[0]]) obj[entry[0]] = []; !Array.isArray(entry[1]) ? obj[entry[0]].push(entry[1]) : (obj[entry[0]] = [...obj[entry[0]], ...entry[1]]); }) ); /*ADDED LOGIC TO HAVE UNIQUE VALUES IN THE OBJECT*/ Object.entries(obj).forEach( (entry) => (obj[entry[0]] = Array.from(new Set(entry[1]))) ); console.log(obj); let result = []; Object.entries(obj).forEach((entry) => result.push({ [entry[0]]: Array.from(new Set(entry[1])), }) ); console.log(result);