0

Ben, iç içe geçmiş bir döngü var ama bunu bir Array eşlemi/ES6 yolu ile yapmak istiyorum, ancak nasıl yuvalanmış forloops ile çalışır? Javascript Döngü için iç içe ES6 ile

 for (var i = 0; i < enemy.ships.length; i++) { 
     for (var n = 0; n < enemy.ships[i].location.length; n++) { 
      if (obj.coordination == enemy.ships[i].location[n]) hit = true; 
     } 
    }; 

ben o kadar değil forloop

players.map(function(player){if(player.id != socket.id) return enemy = player}); 

Ama Dizi Maps veya başka bir şeyle nasıl olması gerektiğini anlamak için görünmüyor zaman bunu nasıl biliyorum.

Gemiler konumunun & obj.coordination konumunu eşleştirmem gerekiyor. Bu benim bir daha işlevsel bir şekilde bunu yapmak için forEach yöntemi kullanabilirsiniz

[ { type: 'Aircaft', 
    size: 5, 
    rekt: false, 
    available: 1, 
    location: [] }, 
    { type: 'Battleship', 
    size: 4, 
    rekt: false, 
    available: 1, 
    location: [ 77, 76, 75, 74 ] }, 
    { type: 'Destroyer', 
    size: 3, 
    rekt: false, 
    available: 2, 
    location: [ 54, 44, 34 ] }, 
    { type: 'Submarine', 
    size: 3, 
    rekt: false, 
    available: 3, 
    location: [] }, 
    { type: 'Patrolboat', 
    size: 2, 
    rekt: false, 
    available: 4, 
    location: [] } ] 
+1

İç içe geçmiş ['forEach'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) döngüsünü kullan – 4castle

+0

Verilerin bir örneğini eklemelisiniz ile çalışıyorsun. – Andy

+0

Sadece veri örneğini koyun – Romano

cevap

3

Aradığınız tüm ise olmadığını herhangi gemi maçları (ve vuruldu gemiyi, vesaire dönen değil), gibi bir şey kullanabilirsiniz herhangi yer:

const hit = enemy.ships 
    .map(ship => ship.location) 
    .some(coordinates => coordinates.some(coordinate => coordinate === obj.coordination)); 

Eğer (birden gemiler aynı koordinatları paylaşan izin verilirse veya gemi) çarptı gemiyi dönmek istedim:

const hitShips = enemy.ships 
    .filter(ship => ship.location.some(coordinate => coordinate === obj.coordination)); 

map Sizin örnek kapalı ... ayrıca biraz.

map ürününün amacı yan etkilere neden olmamalıdır (aslında, özellikle tüm yan etkilerden kaçınılması amaçlanmıştır).
map'un amacı, bir dizi nesneyi almak ve yeni diziyi eski dizinin nesnelerini temel alarak doldurduğunuz, aynı uzunlukta yepyeni bir dizi döndürmektir.

[1, 2, 3].map(x => x + 1); // [2, 3, 4] 
["a", "b", "c"].map(x => x.toUpperCase()); // ["A", "B", "C"] 

sadece her öğeyi kontrol ve yan etkiler daha sonra forEach kullanmak (geçirilen fonksiyonun dışında var olan bir değeri değiştirmek) neden isterseniz

.

+0

Thankyou! Bu çalıştı ve açıklama için teşekkürler. – Romano

2

kontrol etmeliyiz enemy.ships değişkendir. Ancak, yer eşleştikten sonra ondan ayrılmayacaksınız. Ek ref: Örneğin

: how to stop Javascript forEach?

enemy.ships.forEach((ship) => { 
    ship.location.forEach((location) => { 
     if (obj.coordination === location) 
      hit = true; 
    }) 
}) 
+0

André tarafından yayınlanan linkte belirtildiği gibi, sadece geminin vurulup vurulmadığını kontrol etmek isterseniz 'every()' işlevini kullanmalısınız. Referans: https: //developer.mozilla.org/pt-BR/docs/Web/JavaScript/Başvuru/Global_Objects/Array/her –

+0

@AlexandreJunges [Array # some()] 'ı kastediyorsunuz (https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Referans/Global_Objects/Dizi/bazı). değil, her(). – Nickolay

+0

Evet, doğru. Bazı() 'bu dava için doğru seçenek :) –

0

Sen Array.prototype.find ve filtresi kullanabilirsiniz

var compareLocation = (a, b) => a.length === b.length && a.filter((v, i) => v === b[i]).length === a.length; 
var enemyShipFound = enemy.ships.find(ship => compareLocation(obj.coordination, ship.location));