通过node.js循环使用JSON

cra*_*awf 47 foreach json asynchronous node.js

我有一个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
    }]
}
Run Code Online (Sandbox Code Playgroud)

数据中的键并不总是相同的(我刚刚使用了示例,有20个不同的键),因此,我无法设置我的脚本以静态引用它们来获取值.

否则我可以说

var value1 = json.data.Timestamp;
var value2 = json.data.Start_Value;
var value3 = json.data.Abstract;
etc
Run Code Online (Sandbox Code Playgroud)

在过去,我在数据节点上使用了一个简单的foreach循环...

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

但是不想阻止脚本.有任何想法吗?

Van*_*ing 80

您可以通过以下方式迭代JavaScript对象:

for(var attributename in myobject){
    console.log(attributename+": "+myobject[attributename]);
}
Run Code Online (Sandbox Code Playgroud)

myobject可能是你的json.data

  • 但这是否是异步行为? (2认同)
  • 不,不,但我不知道为什么它应该是异步的.Node.js非常快.如果你的对象中有数千个键,我会理解它,但不是20;) (2认同)

mak*_*mak 22

您可能还想在循环中使用hasOwnProperty.

for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        switch (prop) {
            // obj[prop] has the value
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

node.js是单线程的,这意味着您的脚本将阻止您是否需要它.请记住,V8(谷歌的node.js使用的Javascript引擎)将Javascript编译成机器代码,这意味着大多数基本操作都非常快,并且通过具有100个键的对象循环可能需要几纳秒的时间?

但是,如果你在循环里多了很多,你不希望它阻止现在,你可以做这样的事情

switch (prop) {
    case 'Timestamp':
        setTimeout(function() { ... }, 5);
        break;
    case 'Start_Value':
        setTimeout(function() { ... }, 10);
        break;
}
Run Code Online (Sandbox Code Playgroud)

如果您的循环正在进行一些CPU密集型工作,则需要生成子进程来执行该工作或使用Web worker.


Nat*_*eet 18

我建议利用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 ] ];
 }
Run Code Online (Sandbox Code Playgroud)


Mik*_*ott 6

如果你想避免阻塞,这只是非常大的循环所必需的,那么将循环的内容包装在一个名为like:的函数中process.nextTick(function(){<contents of loop>}),这将把执行推迟到下一个tick,从而为来自其他异步函数的挂起调用提供机会待处理.


Tha*_*nga 6

我最喜欢的方式是,

var objectKeysArray = Object.keys(yourJsonObj)
objectKeysArray.forEach(function(objKey) {
    var objValue = yourJsonObj[objKey]
})
Run Code Online (Sandbox Code Playgroud)