Ответ 1
Вы можете перебирать объекты JavaScript таким образом:
for(var attributename in myobject){
console.log(attributename+": "+myobject[attributename]);
}
myobject может быть вашим json.datap >
У меня есть 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 разных ключей), и поэтому я не могу настроить свой script, чтобы статически ссылаться на них, чтобы получить значения.
В противном случае я могу указать
var value1 = json.data.Timestamp;
var value2 = json.data.Start_Value;
var value3 = json.data.Abstract;
etc
В прошлом я использовал простой цикл foreach для данных node...
foreach ($json->data as $key => $val) {
switch($key) {
case 'Timestamp':
//do this;
case: 'Start_Value':
//do this
}
}
Но не хотите блокировать script. Любые идеи?
Вы можете перебирать объекты JavaScript таким образом:
for(var attributename in myobject){
console.log(attributename+": "+myobject[attributename]);
}
myobject может быть вашим json.datap >
Вы также можете использовать hasOwnProperty в цикле.
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
switch (prop) {
// obj[prop] has the value
}
}
}
node.js является однопоточным, что означает, что ваш script будет блокировать, хотите ли вы этого или нет. Помните, что V8 (движок Javascript Google, который использует node.js) компилирует Javascript в машинный код, что означает, что большинство основных операций действительно бывают быстрыми, и цикл через объект со 100 ключами, вероятно, займет пару наносекунд?
Однако, если вы делаете намного больше внутри цикла, и вы не хотите, чтобы он блокировался прямо сейчас, вы могли бы сделать что-то вроде этого
switch (prop) {
case 'Timestamp':
setTimeout(function() { ... }, 5);
break;
case 'Start_Value':
setTimeout(function() { ... }, 10);
break;
}
Если ваш цикл выполняет очень интенсивную работу с процессором, вам нужно будет создать дочерний процесс , чтобы выполнить эту работу или использовать веб-работники.
Я бы рекомендовал воспользоваться тем, что nodeJS всегда будет ES5. Помните, что это не пользователи браузера, вы можете зависеть от реализации языка от стабильности. Тем не менее я бы рекомендовал против использования цикла for-in в nodeJS, если вы действительно не хотите сделать глубокую рекурсию цепи прототипов. Для простого, традиционного цикла я бы рекомендовал использовать метод Object.keys в ES5. Если вы просмотрите следующий тест JSPerf, особенно если вы используете Chrome (так как он имеет тот же движок, что и nodeJS), вы получите общее представление о насколько более эффективен этот метод, чем использование цикла for-in (примерно в 10 раз быстрее). Здесь образец кода:
var keys = Object.keys( obj );
for( var i = 0,length = keys.length; i < length; i++ ) {
obj[ keys[ i ] ];
}
Если вы хотите избежать блокировки, которая необходима только для очень больших циклов, тогда оберните содержимое вашего цикла в функцию, называемую так: process.nextTick(function(){<contents of loop>})
, которая отложит выполнение до следующего тика, предоставив возможность ожидающие вызова от других асинхронных функций, которые необходимо обработать.
Если мы используем 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)
})
})
Не уверен, что это помогает, но похоже, что здесь может быть библиотека для асинхронной итерации в node:
https://github.com/caolan/async
Async - это служебный модуль, который обеспечивает прямолинейные и мощные функции для работы с асинхронным JavaScript. Хотя он первоначально разработан для использования с node.js, его также можно использовать непосредственно в браузере.
Async предоставляет около 20 функций, которые включают в себя обычных "функциональных" подозреваемых (отображение, уменьшение, фильтр, для каждого...), а также некоторые общие шаблоны для потока асинхронного управления (параллельные, последовательные, водопады...). Все эти функции предполагают, что вы следуете за соглашением node.js предоставления одного обратного вызова в качестве последнего аргумента вашей асинхронной функции.
Взгляните на Траверс. Он будет рекурсивно проходить дерево объектов для вас, и на каждом node у вас есть несколько различных объектов, к которым вы можете получить доступ - ключ текущего node, значение текущего node, родительский ток node, полный путь ключа текущего node и т.д. 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);
Моим самым предпочтительным способом является
var objectKeysArray = Object.keys(yourJsonObj)
objectKeysArray.forEach(function(objKey) {
var objValue = yourJsonObj[objKey]
})
Слишком поздно, но я считаю, что необходимы некоторые дополнительные разъяснения, как показано ниже
Вы также можете перебирать JSON Array с помощью простого цикла, например:
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);
}