Estoy tratando de crear una comparación entre una matriz de claves y una matriz de matrices. La matriz de matriz contiene los datos de la siguiente manera:
const data = [ [["id", 1], ["name", "somethign"], ["age", 20]], [["id", 20], ["name", "somethign"]], [["id", 9], ["age", 10]] ]Una matriz con claves, que siempre tendrá todas las claves que necesito.
const keys = [ "id", "name", "age", "nothing" ]Pero como puede ver en la matriz de datos, no siempre todas las claves vienen en la matriz, lo que estaba tratando de hacer era hacer una comparación entre ambas matrices y agregar la clave que falta en la matriz de datos (en orden) como indefinida , por ejemplo (resultado final):
const data = [ [["id", 1], ["name", "somethign"], ["age", 20], ["nothing", undefined]], [["id", 20], ["name", "somethign"],["age", undefined] ["nothing", undefined]], [["id", 9], ["name", undefined], ["age", 10], ["nothing", undefined]] ]map() para obtener una lista de claves existentes (índice 0: d.map(x => x[0]) )filter() para obtener la diferencia entre las keys y las claves existing const data = [ [["id", 1], ["name", "somethign"], ["age", 20]], [["id", 20], ["name", "somethign"]], [["id", 9], ["age", 10]] ]; const keys = [ "id", "name", "age", "nothing" ]; const fixed = data.map(d => { const existing = d.map(x => x[0]); const missing = keys.filter(k => !existing.includes(k)); missing.forEach(m => d.push([ m, undefined ])); return d; }); console.log(fixed);El siguiente método sigue estos pasos:
data en el orden dado, es decir, mantendrá el orden de los datos.keys en el orden de las claves. Entonces, dentro de cada fila, mantendrá el orden de las teclas y las teclas serán consistentes una encima de la otra. Prefiero null sobre undefined aquí, pero puede cambiarlo a indefinido.
const data = [ [ ['id', 1], ['name', 'somethign'], ['age', 20], ], [ ['id', 20], ['name', 'somethign'], ], [ ['id', 9], ['age', 10], ], ]; const keys = ['id', 'name', 'age', 'nothing']; const dataWithMissingKeys = data.map(row => keys.map(key => { const foundItem = row.find(element => element[0] === key); if (foundItem) { return foundItem; } return [key, null]; }) ); console.log(dataWithMissingKeys);Aquí hay un enfoque que se basa en Object.fromEntries y Object.entries :
Object.fromEntriesObject.entries para volver a transformarse en una matriz de pares clave-valor const data = [ [["id", 1], ["name", "somethign"], ["age", 20]], [["id", 20], ["name", "somethign"]], [["id", 9], ["age", 10]] ]; const keys = [ "id", "name", "age", "nothing" ]; const base = Object.fromEntries(keys.map(k => [k, undefined])); console.log( data.map(d => Object.entries({ ...base, ...Object.fromEntries(d) })) )