2017-06-24 19 views
0

ネストループを使用して配列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);

+1

ループが完了した後にtableArrayをどのように表示しますか? – David

+0

私はちょうど概念をテストしている、データは実際のアプリケーションでは大きく異なっています。私はそれの目的のための配列の項目であることに満足しています。ありがとうございました。 – Liondedan

答えて

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);

+0

ありがとうございましたchariletfl雄弁な解決策 – Liondedan

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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

下に示すように、それは外部ライブラリを追加すると、ダウンロードするには、オーバーヘッドのビットを持っているが、アプリ内の他のスポットを見つけた場合lodashが有用である場合には、2行で行うことができます(私は通常やっています)、それが含まれている価値があるかもしれません。

私はロダッシュチームと提携していません。

関連する問題