Javascript嵌套for循环与ES6

时间:2016-04-03 21:26:09

标签: javascript arrays node.js functional-programming ecmascript-6

我们,我有一个嵌套的for循环,但我想用Array map / ES6方式做,但是如何使用嵌套的forloops?

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

我知道怎么做,因为它不是forloop

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

但我似乎无法理解Array Maps或其他内容应该如何。

我需要匹配船舶位置和位置。 obj.coordination。这是我需要检查的enemy.ships变量

    [ { 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: [] } ]

3 个答案:

答案 0 :(得分:4)

如果你要找的是任何船上的任何位置是否匹配(并且没有返回被击中的船等等),你可以使用类似的东西:

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

如果你想要返回被击中的船(或船只,如果允许多艘船共享相同的坐标):

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

map的例子也有点......关闭。

map的目标不是引起副作用(事实上,它特别是为了避免所有副作用)。
map的目标是获取一个对象数组并返回一个完全相同长度的全新数组,您可以根据旧数组的对象填充新数组。

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

如果您只想检查每个项目并导致副作用(更改传入函数之外的值),请使用forEach

答案 1 :(得分:3)

您可以使用forEach方法以更实用的方式执行此操作。但是,一旦位置匹配,您就无法突破它。 补充参考:how to stop Javascript forEach?

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

答案 2 :(得分:0)

您可以使用Array.prototype.find和filter:

例如:

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