Подтвердить что ты не робот

Запуск через JSON с помощью 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
    }]
}

Ключи в данных не всегда будут одинаковыми (я только что использовал примеры, есть 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. Любые идеи?

4b9b3361

Ответ 1

Вы можете перебирать объекты JavaScript таким образом:

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

myobject может быть вашим json.data​​p >

Ответ 2

Вы также можете использовать 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;
}

Если ваш цикл выполняет очень интенсивную работу с процессором, вам нужно будет создать дочерний процесс , чтобы выполнить эту работу или использовать веб-работники.

Ответ 3

Я бы рекомендовал воспользоваться тем, что 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 ] ];
 }

Ответ 4

Если вы хотите избежать блокировки, которая необходима только для очень больших циклов, тогда оберните содержимое вашего цикла в функцию, называемую так: process.nextTick(function(){<contents of loop>}), которая отложит выполнение до следующего тика, предоставив возможность ожидающие вызова от других асинхронных функций, которые необходимо обработать.

Ответ 5

Если мы используем 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)          
           })
      })

Ответ 6

Не уверен, что это помогает, но похоже, что здесь может быть библиотека для асинхронной итерации в node:

https://github.com/caolan/async

Async - это служебный модуль, который обеспечивает прямолинейные и мощные функции для работы с асинхронным JavaScript. Хотя он первоначально разработан для использования с node.js, его также можно использовать непосредственно в браузере.

Async предоставляет около 20 функций, которые включают в себя обычных "функциональных" подозреваемых (отображение, уменьшение, фильтр, для каждого...), а также некоторые общие шаблоны для потока асинхронного управления (параллельные, последовательные, водопады...). Все эти функции предполагают, что вы следуете за соглашением node.js предоставления одного обратного вызова в качестве последнего аргумента вашей асинхронной функции.

Ответ 7

Взгляните на Траверс. Он будет рекурсивно проходить дерево объектов для вас, и на каждом 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);

Ответ 8

Моим самым предпочтительным способом является

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

Ответ 9

Слишком поздно, но я считаю, что необходимы некоторые дополнительные разъяснения, как показано ниже

Вы также можете перебирать 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);
}