3

idsどのリーフにもプロパティを持つことができる JSON オブジェクトを使用しています。idsオブジェクトをトラバースし、プロパティのすべてのインスタンスを見つけて、各 ID をコレクションに格納したいと考えています。

JSON オブジェクトのモックアップ (idsプロパティは、より深いプロパティの場所にある可能性があります)。

{
  "id": "b38a683d-3fb6-408f-9ef6-f4b853ed1193",
  "foo": {
    "ids": [
      {
        "id": "bd0bf3bd-d6b9-4706-bfcb-9c867e47b881"
      },
      {
        "id": "d1cc529d-d5d2-4460-b2bb-acf24a7c5999"
      },
      {
        "id": "b68d0c8c-548e-472f-9b01-f25d4b199a71"
      }
    ],
    "baz": "super"
  },
  "bar": {
    "ids": [
      {
        "id": "bd0bf3bd-d6b9-4706-bfcb-9c867e47b881"
      },
      {
        "id": "d1cc529d-d5d2-4460-b2bb-acf24a7c5999"
      },
      {
        "id": "b68d0c8c-548e-472f-9b01-f25d4b199a71"
      }
    ]
  }
}

上記の JSON をトラバースするために、次のコードを使用しています。

var jsonFile = require('./file_test.json'); // the above in my local directory

function traverse(obj, ids) {
  for (var prop in obj) {
    if (typeof obj[prop] == "object" && obj[prop]) {
      if (prop == 'ids') {
        for (var i = obj[prop].length - 1; i >= 0; i--) {
          ids.push(obj[prop][i]._id);
        };
      }
      traverse(obj[prop], ids);
    }
  }
}

var ids = new Array();
traverse(jsonFile, ids);

console.log('ids', ids);

上記のネットは次のとおりです。

ids
[
  'b68d0c8c-548e-472f-9b01-f25d4b199a71',
  'd1cc529d-d5d2-4460-b2bb-acf24a7c5999',
  'bd0bf3bd-d6b9-4706-bfcb-9c867e47b881',
  'b68d0c8c-548e-472f-9b01-f25d4b199a71',
  'd1cc529d-d5d2-4460-b2bb-acf24a7c5999',
  'bd0bf3bd-d6b9-4706-bfcb-9c867e47b881'
]

私のコードは機能しますが、これが最も効率的または最良の方法であるとは確信していません。プロパティのすべてのインスタンスを見つけるより良い方法はありidsますか? おそらく、配列を渡さずに配列を返すのでしょうか? idsまたは、配列を使用してコールバックを設定しますか?

4

5 に答える 5

7

データが実際に JavaScript オブジェクトではなく JSON 文字列である場合は、次のようになります。

// assuming `json` is the data string
var ids = [];
var data = JSON.parse(json, function(key, value) {
    if (key === "id") 
        ids.push(value);

    return value;
});

JSON.parseメソッドを参照reviverしてください。

于 2013-04-13T23:15:39.863 に答える
0

あなたが基本的にやろうとしているのは、この JSON オブジェクトのツリー検索ですよね? したがって、それが常に葉であると仮定すると、これらのノードは葉にあり、必要なものが含まれていることがわかっているidsため、それらのノードは必要ありません。traverse

  • をに変更if {...} traverse if {...} else {traverse}

のデータ構造をidsオブジェクトのリストではなく文字列のリストに変更できる場合は、配列の繰り返しを保存して、ids渡された配列にマージすることができますが、それは完全にコンテキストに依存しますそして、あなたがこの変化を起こすことができるかどうか!

申し訳ありませんが、私はこれ以上役に立ちません!

于 2013-04-13T21:41:38.070 に答える