2017-02-21 8 views
2

I eine JavaScript verschachteltes Objekt haben, wie unten gezeigt:Extrahieren und Zusammenführen von Arrays aus einem verschachtelten Javascript Objekt

input_data = { 
    "A1":{ 
     "B1":{ 
      "M1" : [ 
       {"E1":"10","E2":"11"}, 
       {"E1":"20","E2":"21"} 
      ], 
      "M2":[ 
       {"E1":"30","E2":"31"}, 
       {"E1":"40","E2":"41"} 
      ], 
      "M3":[ 
       {"E1":"50","E2":"51"} 
      ] 
     } 
    }, 
    "A2":{ 
     "B2":{ 
      "M1": [ 
       {"E1":"60","E2":"61"}, 
       {"E1":"70","E2":"71"} 
      ], 
      "M2":[ 
       {"E1":"80","E2":"81"}, 
       {"E1":"90","E2":"91"} 
      ] 
     } 
    } 
} 

I alle Elemente unter „M1“, „M2“, „M3“ in eine extrahieren, benötigen Array, das heißt, sollte die Ausgabe wie unten gezeigt:

output_data = [ 
      {"E1":"10","E2":"11"}, 
      {"E1":"20","E2":"21"}, 
      {"E1":"30","E2":"31"}, 
      {"E1":"40","E2":"41"}, 
      {"E1":"50","E2":"51"}, 
      {"E1":"60","E2":"61"}, 
      {"E1":"70","E2":"71"}, 
      {"E1":"80","E2":"81"}, 
      {"E1":"90","E2":"91"} 
      ]; 

ich dies auf folgende Weise erreichen könnte:

var output_data = []; 
function traverse(obj) { 
    for (i in obj) { 
     if (!!obj[i] && typeof(obj[i])=="object") { 
      if (Array.isArray(obj[i])){ 
       output_data = output_data.concat([], obj[i]); 
      } 
      traverse(obj[i]); 
     } 
    } 
} 

traverse(input_data); 
console.log(output_data); 

ist th Gibt es eine bessere Möglichkeit, die Kind-Array-Elemente zu extrahieren und zu einem zusammenzuführen?

+0

Wenn es für Sie läuft dann gehört dies auf Codereview. In diesem Fall würde ich das Array output_data innerhalb der Funktion verschieben und es am Ende der Funktion nach der for-Schleife zurückgeben. –

Antwort

1

Sie einen rekursiven Ansatz für verschachtelte Objekte verwenden können.

function flat(object) { 
 
    function f(o) { 
 
     Object.keys(o).forEach(function (k) { 
 
      if (!o[k]) { 
 
       return; 
 
      } 
 
      if (Array.isArray(o[k])) { 
 
       result = result.concat(o[k]); 
 
       return; 
 
      } 
 
      if (typeof o[k] === 'object') { 
 
       f(o[k]); 
 
      } 
 
     }); 
 
    } 
 
    var result = []; 
 
    f(object); 
 
    return result; 
 
} 
 

 
var input_data = { A1: { B1: { M1: [{ E1: "10", E2: "11" }, { E1: "20", E2: "21" }], M2: [{ E1: "30", E2: "31" }, { E1: "40", E2: "41" }], M3: [{ E1: "50", E2: "51" }] } }, A2: { B2: { M1: [{ E1: "60", E2: "61" }, { E1: "70", E2: "71" }], M2: [{ E1: "80", E2: "81" }, { E1: "90", E2: "91" }] } } }; 
 

 
console.log(flat(input_data));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Das Wrapping des Rückgabe-Arrays ist ein besserer Ansatz. Vielen Dank! – nizantz

0

könnten Sie verwenden Array.prototype.map, Object.values und eine Flatten Funktion:

const input = { 
 
    "A1":{ 
 
     "B1":{ 
 
      "M1" : [ 
 
       {"E1":"10","E2":"11"}, 
 
       {"E1":"20","E2":"21"} 
 
      ], 
 
      "M2":[ 
 
       {"E1":"30","E2":"31"}, 
 
       {"E1":"40","E2":"41"} 
 
      ], 
 
      "M3":[ 
 
       {"E1":"50","E2":"51"} 
 
      ] 
 
     } 
 
    }, 
 
    "A2":{ 
 
     "B2":{ 
 
      "M1": [ 
 
       {"E1":"60","E2":"61"}, 
 
       {"E1":"70","E2":"71"} 
 
      ], 
 
      "M2":[ 
 
       {"E1":"80","E2":"81"}, 
 
       {"E1":"90","E2":"91"} 
 
      ] 
 
     } 
 
    } 
 
}; 
 

 
const values = Object.values.bind(Object); 
 
const output = flattenDeep(values(input).map((inner) => values(inner).map(values))); 
 

 
console.log(output); 
 

 
function flattenDeep(array) { 
 
    return array.reduce((flat, value) => { 
 
    if(Array.isArray(value)) { 
 
     flat.push(...flattenDeep(value)); 
 
    } else { 
 
     flat.push(value); 
 
    } 
 
    return flat; 
 
    }, []); 
 
}

Verwandte Themen