web-dev-qa-db-ja.com

node.jsでJSONをループする

以下に示すように、繰り返し処理する必要があるJSONファイルがあります...

{
    "device_id": "8020",
    "data": [{
        "Timestamp": "04-29-11 05:22:39 pm",
        "Start_Value":  0.02,
        "Abstract": 18.60,
        "Editor": 65.20
    }, {
        "Timestamp": "04-29-11 04:22:39 pm",
        "End_Value":  22.22,
        "Text": 8.65,
        "Common": 1.10,
        "Editable": "true",
        "Insert": 6.0
    }]
}

データ内のキーは常に同じではありません(例を使用しただけで、20種類のキーがあります)。そのため、値を取得するために静的に参照するようにスクリプトを設定できません。

そうでなければ私は述べることができます

var value1 = json.data.Timestamp;
var value2 = json.data.Start_Value;
var value3 = json.data.Abstract;
etc

過去に、データノードで単純なforeachループを使用しました...

foreach ($json->data as $key => $val) {
    switch($key) {
        case 'Timestamp':
            //do this;
        case: 'Start_Value':
            //do this
    }
}

ただし、スクリプトをブロックする必要はありません。何か案は?

47
crawf

この方法でJavaScriptオブジェクトを反復処理できます。

for(var attributename in myobject){
    console.log(attributename+": "+myobject[attributename]);
}

myobjectはjson.dataになります

79
Van Coding

ループで hasOwnProperty を使用することもできます。

for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        switch (prop) {
            // obj[prop] has the value
        }
    }
}

node.jsはシングルスレッドです。つまり、スクリプトは必要かどうかをブロックします。 V8(node.jsが使用するGoogleのJavascriptエンジン)はJavascriptをマシンコードにコンパイルします。つまり、ほとんどの基本的な操作は非常に高速で、100キーのオブジェクトをループするにはおそらく数ナノ秒かかります。

ただし、ループ内でさらに多くのことを行い、ブロックすることを望まない場合すぐに、このようなことができます

switch (prop) {
    case 'Timestamp':
        setTimeout(function() { ... }, 5);
        break;
    case 'Start_Value':
        setTimeout(function() { ... }, 10);
        break;
}

ループがCPUを非常に集中的に使用している場合、 child process を生成してその作業を行うか、 web workers を使用する必要があります。

22
mak

NodeJSは常にES5であるという事実を利用することをお勧めします。これは、安定性を確保するために言語の実装に依存できるブラウザではないことを忘れないでください。それは、プロトタイプチェーンを深く再帰する必要がない限り、nodeJSでfor-inループを使用することをお勧めしないことを意味します。シンプルで伝統的なループの場合、ES5でObject.keysメソッドをうまく利用することをお勧めします。次の JSPerfテスト を表示する場合、特にChrome(nodeJSと同じエンジンを持っているため)を使用する場合)この方法を使用するパフォーマンスは、for-inループを使用するよりも(約10倍高速)コードのサンプルを次に示します。

 var keys = Object.keys( obj );
 for( var i = 0,length = keys.length; i < length; i++ ) {
     obj[ keys[ i ] ];
 }
18
Nathan Sweet

非常に大きなループにのみ必要なブロッキングを避けたい場合は、次のような関数でループの内容をラップします:process.nextTick(function(){<contents of loop>})。次のティックまで実行を延期し、機会を与えます他の非同期関数からの保留中の呼び出しを処理するため。

6
Mike Scott

NodeJSを使用している場合、提供するさまざまなライブラリを確実に活用する必要があります。 each()、map()、reduce()などのunderscoreJSの組み込み関数により、作業が軽減されます。ここにサンプルがあります

    var _=require("underscore");
    var fs=require("fs");

    var jsonObject=JSON.parse(fs.readFileSync('YourJson.json', 'utf8'));


    _.map( jsonObject, function(content) {
        _.map(content,function(data){
           if(data.Timestamp)
              console.log(data.Timestamp)          
           })
      })
3
Nish

それが役立つかどうかはわかりませんが、ここでホストされているノードに非同期反復のライブラリがあるかもしれません:

https://github.com/caolan/async

Asyncは、非同期JavaScriptを操作するための簡単で強力な機能を提供するユーティリティモジュールです。最初はnode.jsで使用するように設計されていましたが、ブラウザで直接使用することもできます。

Asyncは、通常の「機能」容疑者(map、reduce、filter、forEach…)や非同期制御フローの一般的なパターン(並列、シリーズ、ウォーターフォールなど)を含む約20の機能を提供します。これらの関数はすべて、非同期関数の最後の引数として単一のコールバックを提供するnode.js規則に従うことを前提としています。

2
JWally

トラバースをご覧ください。オブジェクトツリーを再帰的にたどり、アクセス可能なさまざまなオブジェクトを持っているすべてのノードで、現在のノードのキー、現在のノードの値、現在のノードの親、現在のノードの完全なキーパスなど- https://github.com/substack/js-traverse 。循環参照をスクラブしたいオブジェクトや、さまざまなデータビットを変換しながらディープクローンを実行する必要がある場合に、オブジェクトに良い効果を与えるために使用しました。以下は、サンプルから引き出されたコードで、何ができるかを示しています。

var id = 54;
var callbacks = {};
var obj = { moo : function () {}, foo : [2,3,4, function () {}] };

var scrubbed = traverse(obj).map(function (x) {
    if (typeof x === 'function') {
        callbacks[id] = { id : id, f : x, path : this.path };
        this.update('[Function]');
        id++;
    }
});

console.dir(scrubbed);
console.dir(callbacks);
1
AlexGad

私の最も好ましい方法は、

var objectKeysArray = Object.keys(yourJsonObj)
objectKeysArray.forEach(function(objKey) {
    var objValue = yourJsonObj[objKey]
})
1
Tharanga

遅すぎますが、以下のようにいくつかのさらなる説明が必要だと思います

同様に、単純なループでJSON配列を反復処理できます。

for(var i = 0;i< jsonArray.length;i++)
{
    console.log(jsonArray[i].attributename);
}

Jsonオブジェクトがあり、そのすべての内部オブジェクトをループする場合、まずすべてのキー配列を取得し、キーをループして次のようなキー名を持つオブジェクトを取得する必要があります。

var keys = Object.keys(jsonObject);
for(var i=0,i < keys.length;i++) 
{
    var key = keys[i];
    console.log(jsonObject.key.attributename);
}
0