内部循环中为true时的JavaScript延迟

内部循环中为true时的JavaScript延迟,javascript,for-loop,settimeout,Javascript,For Loop,Settimeout,到目前为止,我还没有找到一个令人满意的解决办法。下面是高层的代码 var a = [1, 2, 3, 4, 5, 6, 7, 8, 9], o = {a:1, b:2, c:3, d:10, e:11, f:12, g:7, h:8, i:9}; function matched(i, j) { return a[i]===o[j]; } for (var i=0; i<a.length; ++i) { for (var j in o) { if (matched(

到目前为止,我还没有找到一个令人满意的解决办法。下面是高层的代码

var a = [1, 2, 3, 4, 5, 6, 7, 8, 9],
  o = {a:1, b:2, c:3, d:10, e:11, f:12, g:7, h:8, i:9};

function matched(i, j) {
  return a[i]===o[j];
}

for (var i=0; i<a.length; ++i) {
  for (var j in o) {
    if (matched(i, j)) console.log(a[i]);
  }
}
var a=[1,2,3,4,5,6,7,8,9],
o={a:1,b:2,c:3,d:10,e:11,f:12,g:7,h:8,i:9};
功能匹配(i,j){
返回a[i]==o[j];
}
对于(var i=0;i),您应该看到输出到控制台的数字1-3和7-9

我想做的是输出数字,每个数字之间有一秒的延迟。我知道如何在每次循环迭代之间引入延迟,但我只想为打印的数字添加延迟(即,
matched()
返回
true


澄清:我目前不满意的解决方案是将匹配的项保存到一个单独的数组中,并延迟迭代该数组,但我正在寻找一个不需要创建新数组的解决方案。

解决方案相对简单:

在收集结果时,不要担心日志记录。而是将所有结果存储在新数组中

然后,延迟迭代该
结果
数组:

var a=[1,2,3,4,5,6,7,8,9],
o={a:1,b:2,c:3,d:10,e:11,f:12,g:7,h:8,i:9},
结果=[];
功能匹配(i,j){
返回a[i]==o[j];
}

对于(var i=0;i而言,解决方案相对简单:

在收集结果时,不要担心日志记录,而是将所有结果存储在一个新数组中

然后,延迟迭代该
结果
数组:

var a=[1,2,3,4,5,6,7,8,9],
o={a:1,b:2,c:3,d:10,e:11,f:12,g:7,h:8,i:9},
结果=[];
功能匹配(i,j){
返回a[i]==o[j];
}

对于(var i=0;i使用代码,但将输出更改为
推入另一个(全局)数组。然后使用计时器逐个打印数组内容

var a = [1, 2, 3, 4, 5, 6, 7, 8, 9],
  o = {a:1, b:2, c:3, d:10, e:11, f:12, g:7, h:8, i:9},
  t = [];

function matched(i, j) {
  return a[i]===o[j];
}

// function to output first element of array
function output(){
  if(t.length > 0){ // only generate output if array t isn't empty
    console.log(t.shift());
    setTimeout(output, 1000); // recall this function after 1s
  }
}

for (var i=0; i<a.length; ++i) {
  for (var j in o) {
    if (matched(i, j)) t.push(a[i]); // store all found items inside the new array
  }
}
output();
var a=[1,2,3,4,5,6,7,8,9],
o={a:1,b:2,c:3,d:10,e:11,f:12,g:7,h:8,i:9},
t=[];
功能匹配(i,j){
返回a[i]==o[j];
}
//函数输出数组的第一个元素
函数输出(){
如果(t.length>0){//仅当数组t不为空时生成输出
console.log(t.shift());
setTimeout(输出,1000);//在1s后调用此函数
}
}

对于(var i=0;i使用代码,但将输出更改为
推入另一个(全局)数组。然后使用计时器逐个打印数组内容

var a = [1, 2, 3, 4, 5, 6, 7, 8, 9],
  o = {a:1, b:2, c:3, d:10, e:11, f:12, g:7, h:8, i:9},
  t = [];

function matched(i, j) {
  return a[i]===o[j];
}

// function to output first element of array
function output(){
  if(t.length > 0){ // only generate output if array t isn't empty
    console.log(t.shift());
    setTimeout(output, 1000); // recall this function after 1s
  }
}

for (var i=0; i<a.length; ++i) {
  for (var j in o) {
    if (matched(i, j)) t.push(a[i]); // store all found items inside the new array
  }
}
output();
var a=[1,2,3,4,5,6,7,8,9],
o={a:1,b:2,c:3,d:10,e:11,f:12,g:7,h:8,i:9},
t=[];
功能匹配(i,j){
返回a[i]==o[j];
}
//函数输出数组的第一个元素
函数输出(){
如果(t.length>0){//仅当数组t不为空时生成输出
console.log(t.shift());
setTimeout(输出,1000);//在1s后调用此函数
}
}
对于(var i=0;iES6溶液,具有

function*getCommon(数组,对象){
var集合=新集合(数组),k;
for(k in o){
if(set.has(o[k])){
产量o[k];
}
};
}
变量a=[1,2,3,4,5,6,7,8,9],
o={a:1,b:2,c:3,d:10,e:11,f:12,g:7,h:8,i:9},
发电机=getCommon(a,o),
间隔=设置间隔(函数(){
var item=generator.next();
如果(项目完成){
间隔时间;
}否则{
console.log(item.value);
}
},1000);
具有

function*getCommon(数组,对象){
var集合=新集合(数组),k;
for(k in o){
if(set.has(o[k])){
产量o[k];
}
};
}
变量a=[1,2,3,4,5,6,7,8,9],
o={a:1,b:2,c:3,d:10,e:11,f:12,g:7,h:8,i:9},
发电机=getCommon(a,o),
间隔=设置间隔(函数(){
var item=generator.next();
如果(项目完成){
间隔时间;
}否则{
console.log(item.value);
}
},1000);
我想做的是输出数字,每个数字之间有一秒的延迟

你在评论中也说过:

…在真正的应用程序中,匹配集可能会变得非常大,因此如果有一个解决方案不需要输出到第三个阵列,我宁愿不消耗更多内存

为了实现这两个目标,您必须完全放弃
for
循环,而是执行一连串的
setTimeout
s

var a=[1,2,3,4,5,6,7,8,9],
o={a:1,b:2,c:3,d:10,e:11,f:12,g:7,h:8,i:9};
功能匹配(i,j){
返回a[i]==o[j];
}
//在'o'中获取属性名称,并从开头开始
var keys=Object.keys(o);
var i=0;
var指数=0;
勾选();
函数tick(){
//获取此刻度的“j”值
var j=键[键索引];
//这是一场比赛吗?
var标志=匹配(i,j);
国际单项体育联合会(旗){
console.log(a[i]);
}
//移动到嵌套循环中的下一个条目
如果(++keyIndex>=keys.length){
keyIndex=0;
如果(++i>=a.length){
//完成
返回;
}
}
//继续
国际单项体育联合会(旗){
//我们输出一个,在下一个之前等待一秒钟
设置超时(勾号,1000);
}否则{
//没有输出,请立即继续
勾选();//参见下面的注释
}
}
我想做的是输出数字,每个数字之间有一秒的延迟

你在评论中也说过:

…在真正的应用程序中,匹配集可能会变得非常大,因此如果有一个解决方案不需要输出到第三个阵列,我宁愿不消耗更多内存

为了实现这两个目标,您必须完全放弃
for
循环,而是执行一连串的
setTimeout
s

var a=[1,2,3,4,5,6,7,8,9],
o={a:1,b:2,c:3,d:10,e:11,f:12,g:7,h:8,i:9};
功能匹配(i,j){
返回a[i]==o[j];
}
//获取'o'中的属性名,一个