2017-07-19 15 views
-2

APIから複数のJSONを受け取ります(Promise.all()の17個のAPI呼び出し)。例オブジェクトのネストされた配列のキーを検索

[ 
    { 
    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 
     } 
    ] 
    } 
] 

と、私は本当に私がしたいキーを取得するために(そしてより一般的なアプローチにそれを得るために)見当がつかない。これまでのところ、私の試みは

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; 
} 

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

あなたには、いくつかのより多くのアイデアを持っていますされていますか?私はまだJavaScriptを学んでいるので、きれいで包括的なソリューションを望んでいますが、自分で構築することはできませんでした。

あなたが指定したキーに格納されているすべての値を取得するための関数の下に使用することができます
+0

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; }, []) } 

コールをあなたは、なぜパスを知っていればフィルターをかけて必要なものを得るためにロダッシュを使用しないでください。 [この記事の例はこちら](https://stackoverflow.com/questions/17096988/lodash-how-do-i-use-filter-when-i-have-nested-object) –

+1

https:// developerを見てください.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map – jumpdart

+0

私はこの具体例のパスを知っていますが、パス以外の例もあります。私の目標は、引数としてキーを与え、それに対応するすべての値を取得するだけで、それを全面的に再利用するための汎用関数を作成することでした – Tobias

答えて

0

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"));

関連する問題