如何遍历给定的对象数组,以便能够以混合顺序使用元素。这对于Loop来说非常简单,但是假设driver.sleep(ms)是一个异步函数,它将不起作用。如何使用forEach完成以下操作?
var x = [
{ a: 'Quas',
b: 'Quas',
c: 'Quas'
},
{ a: 'Wex',
b: 'Wex',
c: 'Wex'
},
{ a: 'Exort',
b: 'Exort',
c: 'Exort'
}
]
x.forEach(function(instance) {
var a = instance.a;
var b = instance.b;
var c = instance.c;
driver.sleep(2000).then(function() {
console.log(a);
});
driver.sleep(2000).then(function() {
console.log(b);
});
driver.sleep(2000).then(function() {
console.log(c);
});
driver.sleep(2000).then(function() {
console.log("Invoke");
});
});
给定代码打印:
Quas
Quas
Quas
Quas
调用
WEX
WEX
WEX
调用
Exort
Exort
Exort
调用
如何遍历对象数组以便记录:
Quas
WEX
WEX
调用
Quas
WEX
Exort
调用
Quas
Exort
Exort
调用
请注意,driver.sleep(ms)是异步的。
答案 0 :(得分:0)
试试这个
var x = [
{ a: 'Quas', b: 'Quas', c: 'Quas' },
{ a: 'Wex', b: 'Wex', c: 'Wex' },
{ a: 'Exort', b: 'Exort', c: 'Exort' }
];
var order = [0, 1, 1, 0, 1, 2, 0, 2, 2];
var loggedKeys = {};
order.forEach(function(i, index) {
var loggingKey;
var loggableKeys = Object.keys(x[i]).sort();
if (loggedKeys[i] === undefined) {
loggingKey = loggableKeys[0];
} else {
var k = loggableKeys.indexOf(loggedKeys[i]);
loggingKey = loggableKeys[k + 1];
}
console.log(loggingKey, x[i][loggingKey]); // Print here
loggedKeys[i] = loggingKey;
if ((index+1) % 3 == 0) {
console.log('Invoke');
}
});
答案 1 :(得分:0)
在我们的评论中进行讨论后,这似乎是您解决特殊需求的最佳方式。
我们还没有讨论“调用”的作用是什么,所以我只是把它扔进那里。
忽略初始代码部分,它只是模拟您的driver.sleep
代码。作为实际解决方案的代码部分是您指定预定义顺序并迭代它的地方,而不是迭代x
本身。
// mock node
var driver = {
sleep: function(timeout) {
var promise = {
then: function(callback) {
this.invoke = callback;
}
};
setTimeout(function() { promise.invoke(); }, timeout);
return promise;
}
};
var x = [
{ a: 'Quas',
b: 'Quas',
c: 'Quas'
},
{ a: 'Wex',
b: 'Wex',
c: 'Wex'
},
{ a: 'Exort',
b: 'Exort',
c: 'Exort'
}
];
var specificArbitraryOrder = [
[0,'a'],[1,'a'],[1,'b'],'Invoke',
[0,'b'],[1,'c'],[2,'a'],'Invoke',
[0,'c'],[2,'b'],[2,'c'],'Invoke'
];
specificArbitraryOrder.forEach(function(item) {
driver.sleep(2000).then(function() {
if(typeof item === 'string')
console.log(item);
else
console.log(x[item[0]][item[1]]);
});
});