是否可以逐个循环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);
抱歉,如果它是重复的,我还没有找到解决方案。
答案 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;
答案 2 :(得分:0)
原生:
您可以使用Object.keys
和setTimeout
内置函数获取数组中的键列表。
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));
}
正如你所看到的,可能性是无穷无尽的。