Tengo una matriz anidada que se ve así:
[["Organisation","ID","Name"],["ACME","123456","Bart Simpson"],["ACME","654321","Ned Flanders"],["ACME","1234","Edna Kabappel"],["Yahoogle","666666","Bon Scott"],["Yahoogle","99999","Neil Young"],["Yahoogle","111111","Shania Twain"]]
El primer valor de cada matriz es el nombre de una organización a la que pueden pertenecer un ID y un nombre.
Estoy tratando de encontrar la forma más sencilla de agrupar todas las instancias en las que una identificación y un nombre pertenecen a la misma empresa, bajo una 'clave'.
Entonces, lo anterior resultaría en algo como esto:
{ "ACME": [ { "ID": 123456, "Name": "Bart Simpson" }, { "ID": 654321, "Name": "Ned Flanders" }, { "ID": 1234, "Name": "Edna Kabappel" } ], "Yahoogle": [ { "ID": 666666, "Name": "Bon Scott" }, { "ID": 99999, "Name": "Neil Young" }, { "ID": 111111, "Name": "Shania Twain" } ] }He estado jugando con bucles for pero termino con muchas líneas de código, tratando de detectar cuándo el nombre de la empresa es diferente del anterior y me estoy metiendo en un verdadero lío con las cosas.
He buscado mucho aquí tratando de encontrar algo similar, pero no he tenido suerte.
Recién comencé a codificar nuevamente para el interés de la persona después de aproximadamente 18 años y soy muy novato nuevamente.
Gracias de antemano por cualquier ayuda.
Usando Array.reduce . Por favor, compruebe si esto funciona para usted. En el siguiente enfoque, la ID y el Name están codificados de forma rígida. Puede intentar escribir un enfoque dinámico genérico que maneje cualquier cantidad de parámetros como ID, nombre, edad, etc.
const myArray = [ ["Organisation", "ID", "Name"], ["ACME", "123456", "Bart Simpson"], ["ACME", "654321", "Ned Flanders"], ["ACME", "1234", "Edna Kabappel"], ["Yahoogle", "666666", "Bon Scott"], ["Yahoogle", "99999", "Neil Young"], ["Yahoogle", "111111", "Shania Twain"] ]; const obj = myArray.reduce((acc, value, index) => { if (index === 0) return acc; const key = value[0]; if (!acc[key]) { acc[key] = []; } acc[key].push({ ID: value[1], Name: value[2] }); return acc; }, {}); console.log(obj);muchas soluciones para llegar al mismo resultado, una que usa lambda y reduce: esta es una solución genérica, solo adapte el empuje de salida para construir su json final.
const datas = [ ["Organisation", "ID", "Name"], ["ACME", "123456", "Bart Simpson"], ["ACME", "654321", "Ned Flanders"], ["ACME", "1234", "Edna Kabappel"], ["Yahoogle", "666666", "Bon Scott"], ["Yahoogle", "99999", "Neil Young"], ["Yahoogle", "111111", "Shania Twain"] ]; const titles = datas.shift() const groupBy = (x,f)=>x.reduce((a,b)=>((a[f(b)]||=[]) .push({[titles[1]]:b[1], [titles[2]]:b[2]}),a),{}); const result = groupBy(datas, v => v[0]) console.log(result)Para lograr lo que desea, puede seguir los siguientes pasos:
A continuación se muestra una implementación de muestra, asumiendo que sus datos se almacenan en data :
var result = {}; for(var i=1; i < data.length; i++){ if(!result.hasOwnProperty(data[i][0])){ result[data[i][0]] = []; } result[data[i][0]].push({ "ID": data[i][1], "Name": data[i][2]}); }