逐个获取json项目

时间:2016-07-22 16:06:44

标签: javascript json

是否可以逐个循环json对象? 让我们说我有这个对象(文本)。我希望循环播放text并每隔1分钟获取下一个项,直到我全部收到。我怎么能用javascript做到这一点?

 var text = 
        {
        "name":"John Johnson",
        "street":"Oslo West 16",
        "determine":"555 1234567",
        "JSON":"concernant",
        "you":"value"
        };

       setInterval(function(){
       //text.getnext
       }, 1000);
抱歉,如果它是重复的,我还没有找到解决方案。

4 个答案:

答案 0 :(得分:3)

如果订单不重要,您可以使用Object.keys

var keys = Object.keys(text), i = 0;

var myInterval = setInterval(function(){
   if(i >= keys.length) clearInterval(myInterval); // You need to clear the interval ;) 
   var current = text[keys[i++]];
  //.....
}, 1000*60); //1 minute

我希望这会对你有所帮助。

答案 1 :(得分:1)

您可以使用Iterators的精湛MDN示例并将其用于属性。

对于每个间隔,使用next()调用迭代器,然后检查该值。如果完成,请清除间隔或显示属性。



function makeIterator(array) {
    var nextIndex = 0;
    return {
        next: function () {
            return nextIndex < array.length ?
                { value: array[nextIndex++], done: false } :
                { done: true };
        }
    };
}

var text = { "name": "John Johnson", "street": "Oslo West 16", "determine": "555 1234567", "JSON": "concernant", "you": "value" },
    iterator = makeIterator(Object.keys(text)),
    interval = setInterval(function () {
        var k = iterator.next();
        if (k.done) {
            clearInterval(interval);
        } else {
            console.log(text[k.value]);
        }                                // this value is for demo purpose
    }, 1000);                           // for a minute interval change to 60000
&#13;
&#13;
&#13;

答案 2 :(得分:0)

原生:

您可以使用Object.keyssetTimeout内置函数获取数组中的键列表。

Object.keys返回一个对象的键数组 setTimeout接受一个函数并在一定的毫秒数(1000)后执行它

所以在你的情况下

  var keys = Object.keys(array);
  function iterate(keys, index){
     if(index == keys.length)
        return;
     else{
        console.log("current is " + array[keys[index]]);
        setTimeout(function(){iterate(keys, index + 1)}, 1000);
     }
  }

然后拨打itterate(text, 0);

答案 3 :(得分:0)

首先应该解决一些延迟发送数组元素的一般问题。完成后,将其应用于对象的键很容易。

这是使用setTimeout的简单版本:

function emitWithDelay(array, callback) {
  var n = 0;

  function emitOne() {
    if (n >= array.length) return;

    setTimeout(function() {
      callback(array[n++]);
      emitOne();
    }, 1000);

  }

  emitOne();
}

现在你可以做到

emitWithDelay(Object.keys(obj), myCallback);

这对于使用流或可观察对象来说是一个很好的问题。它就像

一样简单
Observable.from(Object.keys(obj))
  .delay(1000)
  .subscribe(elt => console.log("got elt", elt));

异步方法

另一个想法是使用异步功能,一种ES7功能,如下所示:

async function emitWithDelay(array, callback) {
  for (elt of array) {
    callback(elt);
    await sleep(1000);
  }
}

其中sleep类似于

function sleep(n) {
  return new Promise(resolve => setTimeout(resolve, n));
}

正如你所看到的,可能性是无穷无尽的。