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
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)
如果你想避免阻塞,这只是非常大的循环所必需的,那么将循环的内容包装在一个名为like:的函数中process.nextTick(function(){<contents of loop>}),这将把执行推迟到下一个tick,从而为来自其他异步函数的挂起调用提供机会待处理.
我最喜欢的方式是,
var objectKeysArray = Object.keys(yourJsonObj)
objectKeysArray.forEach(function(objKey) {
var objValue = yourJsonObj[objKey]
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
133700 次 |
| 最近记录: |