嵌套循环迭代

时间:2017-06-24 23:53:25

标签: javascript

我使用嵌套循环迭代数组bookingArray。如果bookingArrayroomNumber与第一个循环i的索引匹配,则应将该bookingArray项推送到新数组tableArray

我遇到了一个问题,即我的else语句中的多个条目会添加到结果tableArray中。它可能与正确使用break / continue有关吗?我已经阅读了文档,但正确的解决方案使我无法接受。

预期结果:

"1: room booked",
"2: room available",
"3: room available",
"4: room available",
"5: room booked",
"6: room available",
"7: room available",
"8: room available",
"9: room booked",
"10: room available"

当前代码的小提琴:



var bookingArray = [{
    "roomNumber": 1,
  },
  {
    "roomNumber": 5,
  },
  {
    "roomNumber": 9,
  }
];

var tableArray = [];


for (var i = 1; i < 11; i++) {
  for (var j = 0; j < bookingArray.length; j++) {
    if (i == bookingArray[j].roomNumber) {
      tableArray.push(bookingArray[j].roomNumber + ": room booked");
      break;
    } else {
      tableArray.push(i + ": room available");
    }
  }
}

console.log(tableArray);
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:3)

因为内部循环每次外循环迭代都会运行多次。使用内部循环只是设置一个标志,一旦完成,然后根据该标志每次外循环迭代推送一次:

var bookingArray = [{
    "roomNumber": 1,
  },
  {
    "roomNumber": 5,
  },
  {
    "roomNumber": 9,
  }
];

var tableArray = [];


for (var i = 1; i < 11; i++) {
  var isBooked = false;
  for (var j = 0; j < bookingArray.length; j++) {
    if (i == bookingArray[j].roomNumber) {
      isBooked = true;
      break;
    }
  }
  var msg = isBooked ? ": room booked" : ": room available";
  tableArray.push(i + msg);
}

console.log(tableArray);

答案 1 :(得分:1)

charlietfl的解决方案是正确的。作为替代方案,使用库lodash可以显着缩短此代码。它可以用两行完成,如下所示

&#13;
&#13;
var bookingArray = [{
    "roomNumber": 2,
  },
  {
    "roomNumber": 5,
  },
  {
    "roomNumber": 9,
  }
];

var booked = _.map(bookingArray, 'roomNumber');
var unbooked = _.difference(_.range(11), booked);

console.log("Booked:", booked);
console.log("Not Booked:", unbooked);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

添加外部库确实有一些下载的开销,但是如果你在app中找到lodash有用的其他地方(我通常会这样做),那么包含它可能是值得的。

我与lodash团队没有任何关系。