2017-04-03 14 views
0

[OK]をこれでJavaScriptオブジェクト/ JSON:配列にJavaScriptオブジェクト/ JSONのすべての項目を区切る方法

{ 
    "marco":{ 
     "gender":"men", 
     "age":29, 
     "children":{ 
      "jen":{ 
       "gender":"women", 
       "age":14 
      }, 
      "marco jr.":{ 
       "gender":"men", 
       "age":16, 
       "children":{ 
        "Koos":{ 
         "gender":"men", 
         "age":1 
        } 
       } 
      } 
     } 
    }, 
    "lisa":{ 
     "gender":"women", 
     "age":20 
    }, 
    "mike":{ 
     "gender":"men", 
     "age":32, 
     "children":{ 
      "carl":{ 
       "gender":"women", 
       "age":19 
      } 
     } 
    } 
} 

私はマルコを選択した場合の出力が可能になるということをしたい

["jen":{"gender":"women", "age":14}, "marco jr.":{"gender":"men", "age":16}, "Koos":{"gender":"men", "age":1}] 

複数のレイヤーを持つ大きなオブジェクトを1つの大きな配列にスライスする必要があります。だから、もうオブジェクトの3つはありません。

解決策は考えられません。

+0

あなたの配列に非数値キーを入れたいですか?['" jen ":{'? –

+0

オブジェクトと(キー)名をとる再帰関数を作成します。 「子」オブジェクトとそのキーで再帰的に呼び出します。あなたの結果はおそらく配列ではなくオブジェクトでなければなりません。 –

+0

javascriptには連想配列はなく、インデックス配列だけがあります。この他のstackoverflowの質問:[javascript array associative AND indexed?](http://stackoverflow.com/questions/1076658/javascript-array-associative-and-indexed#1076669)で詳しく読むことができます。 –

答えて

1

そんなに上のマルコのすべての子供たち、子供たちのすべてを見つける必要がある、とこれは再帰関数に適した作業です。このような何か:(JSFiddle

function getDescendents(family, memberName) { 
    function inner(children, r) { 
     for (var k in children) { 
      if (children.hasOwnProperty(k)) { 
       r[k] = { 
        age: children[k].age, 
        gender: children[k].gender 
       }; 
       inner(children[k].children, r); 
      } 
     } 
    } 

    var r = {}; 
    inner(family[memberName].children, r); 
    return r; 
} 
console.log(getDescendents(family, 'marco')); 

これは、本質的にネストされたオブジェクトを平坦化された - もそうなFastest way to flatten/un-flatten nested JSON objectsなど、以前の回答を参照してください。 One liner to flatten nested object; Flattening deeply nested array of objects

これは、配列(インデックス番号のみを持つことができる)ではなく、名前をキーとしてオブジェクトを返すことを前提としています。

+0

ありがとう、これは私が探していたものでした!私は入れ子にされたオブジェクトを平坦化したかったのか分からなかった。 jsfiddleは予期しているようです!今これを試して:) –

+0

私は私のサンプルオブジェクトを作成して間違いを犯しました。あなたはこの配列にコードを調整してください:[リンク](https://jsfiddle.net/emcqvmt9/)私はそれをしようとしましたが、運が無ければ.. –

+0

https://jsfiddle.net/76cxc7ob/3/を参照してください – Stuart

-3

jsonオブジェクトを検索するためにjavascriptを使用している場合は、「JSON.parse()」機能を使用してください。このページでは

ルックhttps://www.w3schools.com/js/js_json_parse.asp

それとも、あなたがこれを行うには再帰を使用することができ、アレイ

+0

それはちょうどJSオブジェクトにJSONを変換するが、OPが望む方法ではない。 – George

+0

応答に感謝しますが、@ Georgeが言うことは、これが私が望むものではありません。 –

0

にこれを変換する「json_decode()」メソッドPHPの使用を使用している場合。親の名前と一致するときは、結果に追加することを知っているように、次回の繰り返しの繰り返しに追加する必要があります。

var obj = {"marco":{"gender":"men","age":29,"children":{"jen":{"gender":"women","age":14},"marco jr.":{"gender":"men","age":16,"children":{"Koos":{"gender":"men","age":1}}}}},"lisa":{"gender":"women","age":20},"mike":{"gender":"men","age":32,"children":{"carl":{"gender":"women","age":19}}}} 
 

 
function toArray(data, name, parent) { 
 
    var result = []; 
 
    for (var i in data) { 
 
    if(i == name || parent == true) { 
 
    \t if(i != name) result.push({[i]: {gender: data[i].gender, age: data[i].age}}) 
 
    \t result = result.concat(toArray(data[i].children, name, true)) 
 
    } 
 

 
    result = result.concat(toArray(data[i].children, name, false)) 
 
    } 
 
    return result; 
 
} 
 

 
console.log(JSON.stringify(toArray(obj, 'marco', false), 0, 4)) 
 
console.log(JSON.stringify(toArray(obj, 'marco jr.', false), 0, 4)) 
 
console.log(JSON.stringify(toArray(obj, 'mike', false), 0, 4))

関連する問題