Hay varios campos en un objeto como este.
{ "image-processing": { "type": "lib", "data": { "files": [ { "file": "libs/photography/processing/.babelrc", "hash": "62d50f586b2880f9d58ca4e9a84914c6a0d4936d" }, { "file": "libs/photography/processing/src/lib/processing.ts", "hash": "a285d3554f264cc60f35bef6180298badb0478d1", "deps": [ "npm:gm", "npm:mongodb" ] } ] } }, "image-processing-2": { "type": "lib", "data": { "files": [ { "file": "libs/photography/processing/.babelrc", "hash": "62d50f586b2880f9d58ca4e9a84914c6a0d4936d", "deps": [ "npm:gm", "npm:faker" ] }, { "file": "libs/photography/processing/src/lib/processing.ts", "hash": "a285d3554f264cc60f35bef6180298badb0478d1", "deps": [ "npm:gm", "npm:mongodb" ] } ] } } } Solo necesito el tipo y el contenido de data.files.deps como objeto de valor para la clave. Como puede ver, cada archivo tiene una matriz de deps opcional. Todos los valores de deps deben fusionarse.
Así que el resultado debería ser:
{ "image-processing": { type: "lib", packages: [ "npm:gm", "npm:mongodb" ] }, "image-processing-2": { type: "lib", packages: [ "npm:faker", "npm:gm", "npm:mongodb" ] } }Intenté iterar a través del objeto, pero esto sobrescribiría el valor en lugar de agregar nuevos nombres de paquetes al valor:
const result = {} Object.entries(data).map(([key, value]) => { result[key].type = value.type result[key].packages = value?.data?.files.map(d => d.deps) })Use flatMap en lugar de map para que tenga una matriz aplanada de cadenas de dependencia, y alterne con la matriz vacía para que las propiedades .deps no definidas no causen problemas.
const data={"image-processing":{type:"lib",data:{files:[{file:"libs/photography/processing/.babelrc",hash:"62d50f586b2880f9d58ca4e9a84914c6a0d4936d"},{file:"libs/photography/processing/src/lib/processing.ts",hash:"a285d3554f264cc60f35bef6180298badb0478d1",deps:["npm:gm","npm:mongodb"]}]}},"image-processing-2":{type:"lib",data:{files:[{file:"libs/photography/processing/.babelrc",hash:"62d50f586b2880f9d58ca4e9a84914c6a0d4936d",deps:["npm:gm","npm:faker"]},{file:"libs/photography/processing/src/lib/processing.ts",hash:"a285d3554f264cc60f35bef6180298badb0478d1",deps:["npm:gm","npm:mongodb"]}]}}}; const output = Object.fromEntries( Object.entries(data).map(([key, value]) => [ key, { type: 'lib', packages: [...new Set(value.data.files.flatMap(file => file.deps ?? []))] } ]) ); console.log(output);Según sus nuevos comentarios, solo para separar un poco la lógica:
Repita las entradas de Object.entries para obtener un par clave/valor (el valor es el objeto), y luego repita los archivos de cada objeto. Si hay alguna dependencia, filter las " map ", luego asigne esa matriz y cree una nueva con los nombres actualizados.
Agregue esa matriz a la matriz de packages .
Finalmente, aplane la matriz de paquetes, elimínela creando un nuevo conjunto a partir de ella y luego extiéndala nuevamente en una matriz como el valor del objeto de paquetes que luego agrega al objeto de salida usando la clave.
const data={"image-processing":{type:"lib",data:{files:[{file:"libs/photography/processing/.babelrc",hash:"62d50f586b2880f9d58ca4e9a84914c6a0d4936d"},{file:"libs/photography/processing/src/lib/processing.ts",hash:"a285d3554f264cc60f35bef6180298badb0478d1",deps:["npm:gm","npm:mongodb"]}]}},"image-processing-2":{type:"lib",data:{files:[{file:"libs/photography/processing/.babelrc",hash:"62d50f586b2880f9d58ca4e9a84914c6a0d4936d",deps:["npm:gm","npm:faker"]},{file:"libs/photography/processing/src/lib/processing.ts",hash:"a285d3554f264cc60f35bef6180298badb0478d1",deps:["npm:gm","npm:mongodb"]}]}}}; // Output object const out = {}; // Iterate over the object entries for (const [key, obj] of Object.entries(data)) { // Destructure the type, and the files // array from each object const { type, data: { files } } = obj; const packages = []; // Iterate over each `files` array for (const file of files) { if (file.deps) { // `filter` out the "npm" names, and // then `map` over that array to update the names const list = file.deps .filter(dep => dep.startsWith('npm:')) .map(dep => dep.replace('npm:', '')); // Bang that completed array into `packages` packages.push(list); } } // Finally create a new key/value on the output // object by setting the value as an object // with `type`, and the flattened, deduped packages array out[key] = { type, packages: [...new Set(packages.flat())] }; } console.log(out);