2017-07-19 8 views
-2

Ich erhalte mehrere JSONs von einer API (17 API-Aufrufe mit Promise.all()). Zum BeispielSchlüssel im verschachtelten Array von Objekten finden

[ 
    { 
    key: value, 
    key: value, 
    key: value, 
    key: value, 
    values: [ 
     { 
     key: value, 
     key: value, 
     key: value, 
     keyIWant: value 
     } 
     { 
     key: value, 
     key: value, 
     key: value, 
     keyIWant: value 
     } 
     { 
     key: value, 
     key: value, 
     key: value, 
     keyIWant: value 
     } 
    ] 
    } 
    { 
    key: value, 
    key: value, 
    key: value, 
    key: value, 
    values: [ 
     { 
     key: value, 
     key: value, 
     key: value, 
     keyIWant: value 
     } 
     { 
     key: value, 
     key: value, 
     key: value, 
     keyIWant: value 
     } 
     { 
     key: value, 
     key: value, 
     key: value, 
     keyIWant: value 
     } 
    ] 
    } 
    { 
    key: value, 
    key: value, 
    key: value, 
    key: value, 
    values: [ 
     { 
     key: value, 
     key: value, 
     key: value, 
     keyIWant: value 
     } 
     { 
     key: value, 
     key: value, 
     key: value, 
     keyIWant: value 
     } 
     { 
     key: value, 
     key: value, 
     key: value, 
     keyIWant: value 
     } 
    ] 
    } 
] 

und ich habe wirklich keine Ahnung, den Schlüssel Ich möchte zu bekommen (und es auf einen allgemeineren Ansatz zu bekommen). Bisher haben meine Versuche

gewesen
static _findKey(nestedData) { 
    const result = []; 
    const buffer = []; 
    for (const prop in nestedData) { 
     const value = nestedData[prop]; 
     if (typeof value === "object") { 
      buffer.push(Class._findKey(value)); 
     } 
     if (prop === "keyIWant") { // key would be an argument from the function if it'd worked 
      result.push(value); // doesn't work because of recursive call? 
     } 
    } 
    return result; 
} 

und

static _findKey(projects) { // 
    return projects.forEach(project => { 
     return project.values.forEach(projectValue => { 
      return projectValue.key; 
     }); 
    }); 
} 

Haben Sie noch weitere Ideen? Ich lerne immer noch JavaScript und möchte daher eine saubere und umfassende Lösung, konnte aber keine selbst bauen.

+0

wenn Sie den Pfad, warum Verwenden Sie lodash nicht, um zu filtern und zu bekommen, was Sie brauchen? [Beispiel hier in diesem Beitrag] (https://stackoverflow.com/questions/17096988/lodash-how-do-i-use-filter-when-i-have-nested-object) –

+1

in https: // Entwickler schauen .mozilla.org/de-DE/docs/Web/JavaScript/Referenz/Global_Objects/Array/map – jumpdart

+0

Ich kenne den Pfad für dieses spezielle Beispiel, aber es gibt vielleicht andere Beispiele, die ich nicht den Pfad. Mein Ziel war es, eine generische Funktion zu erstellen, um sie die ganze Zeit wiederzuverwenden, indem ich den Schlüssel als Argument gebe und alle entsprechenden Werte erhalte – Tobias

Antwort

0

Sie unter Funktion verwenden können, um alle Werte auf dem Schlüssel gespeichert erhalten Sie an:

function getKeyValues(arr, key) { 
    return arr.reduce((a,b) => { 
     let keys = Object.keys(b); 
     keys.forEach(v => { 
      if (Array.isArray(b[v])) a = a.concat(getKeyValues(b[v], key)); 
      if (v === key) a = a.concat(b[v]); 
     }); 
     return a; 
    }, []) 
} 

Anruf mit

getKeyValues(arr, "keyIWant") 

let arr = [{ 
 
    key: 'foo', 
 
    values: [{ 
 
     key: 'value', 
 
     keyIWant: 'keyIWant1' 
 
     }, 
 
     { 
 
     key: 'value', 
 
     keyIWant: 'keyIWant2' 
 
     }, { 
 
     key: 'value', 
 
     keyIWant: 'keyIWant3' 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    key: 'foo', 
 
    values: [{ 
 
     key: 'value', 
 
     keyIWant: 'keyIWant4' 
 
     }, 
 
     { 
 
     key: 'value', 
 
     keyIWant: 'keyIWant5' 
 
     }, { 
 
     key: 'value', 
 
     keyIWant: 'keyIWant6' 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
function getKeyValues(arr, key) { 
 
    return arr.reduce((a, b) => { 
 
    let keys = Object.keys(b); 
 
    keys.forEach(v => { 
 
     if (Array.isArray(b[v])) a = a.concat(getKeyValues(b[v], key)); 
 
     if (v === key) a = a.concat(b[v]); 
 
    }); 
 
    return a; 
 
    }, []); 
 
} 
 

 

 
console.log(getKeyValues(arr, "keyIWant"));

Verwandte Themen