如何在node.js中只遍历一个对象数组的几个元素?

时间:2017-05-23 04:45:22

标签: javascript json node.js

如何遍历给定的对象数组,以便能够以混合顺序使用元素。这对于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)是异步的。

2 个答案:

答案 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]]);
    });
});