así que tengo una matriz en la que una clave tiene otra matriz de objetos. Necesito hacer una matriz única de objetos a partir de esta matriz basada en dos niveles de clave e ID de usuario usando lodash o vanila JavaScript
por ejemplo
const data = [ { values: { output: [], } }, { values: { output: [ { level: 1, userId: "810", }, { level: 1, userId: "811", }, { level: 2, userId: "811", }, ], }, }, { values: { output: [ { level: 1, userId: "810", }, ], } }, { values: { output: [ { level: 1, userId: "810", }, { level: 3, userId: "810", }, ], } }, { values: { output: [ { level: 1, userId: "810", }, { level: 3, userId: "810", }, ], } } ];y la salida esperada es
let output =[ { level: 1, userId: "810", }, { level: 1, userId: "811", }, { level: 2, userId: "811", }, { level: 3, userId: "810", }, ]Obtenga una matriz de todas las propiedades de output con _.flatMap() (o Array.flatMap() , y luego use _.uniqBy() para obtener solo elementos únicos. En la devolución de llamada _.uniqBy() devuelva un valor personalizado combinando el level y userId a una sola cadena.
ES5:
var data = [{"values":{"output":[]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":1,"userId":"811"},{"level":2,"userId":"811"}]}},{"values":{"output":[{"level":1,"userId":"810"}]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":3,"userId":"810"}]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":3,"userId":"810"}]}}]; var result = _.uniqBy( _.flatMap(data, function(o) { return o.values.output; }), function(o) { return o.level + '-' + o.userId; } ); console.log(result); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>ES6:
const data = [{"values":{"output":[]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":1,"userId":"811"},{"level":2,"userId":"811"}]}},{"values":{"output":[{"level":1,"userId":"810"}]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":3,"userId":"810"}]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":3,"userId":"810"}]}}]; const result = _.uniqBy( _.flatMap(data, o => o.values.output), o => `${o.level}-${o.userId}` ); console.log(result); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>Aquí hay una solución JS muy vainilla. Esto no será rápido en grandes conjuntos de datos, pero para conjuntos como su ejemplo, no es tan malo. Primero reúne todos sus datos en una sola matriz y luego crea una matriz nueva y sin duplicados. Si necesita tener cuidado al sobrescribir los datos que pasa, puede clonarlos primero.
function mergeAllData(data) { var allData = []; for (var i in data) { allData = allData.concat(data[i].values.output); } return allData; } function filterDuplicates(allData) { var ret = []; for (var i in allData) { var current = allData[i]; ret.push(current); for (var j in allData) { if (isADuplicate(current, allData[i])) { allData.splice(j, 1); } } } return ret; } function isADuplicate(t1, t2) { return t1.level === t2.level && t1.userId === t2.userId; } console.log(filterDuplicates(mergeAllData()));