我使用嵌套循环迭代数组bookingArray
。如果bookingArray
项roomNumber
与第一个循环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;
答案 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可以显着缩短此代码。它可以用两行完成,如下所示
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;
添加外部库确实有一些下载的开销,但是如果你在app中找到lodash有用的其他地方(我通常会这样做),那么包含它可能是值得的。
我与lodash团队没有任何关系。