通过mapsOrder数组确定下一个地图

问题描述 投票:3回答:3

我有mapsOrder数组和mapsData对象数组:

let mapsOrder = [1,2,1,3];
let mapData = [
  {
    id: 1,
    gates: [
      {
        toId: 2,
        coords: {
          x: 2,
          y: 42
        }
      },
      {
        toId: 3,
        coords: {
          x: 9,
          y: 4
        }
      }
    ]
  },
  {
    id: 2,
    gates: [
      {
        toId: 1,
        coords: {
          x: 6,
          y: 5
        }
      }
    ]
  },
  {
    id: 3,
    gates: [
      {
        toId: 1,
        coords: {
          x: 2,
          y: 1
        }
      }
    ]
  }
]

我想要实现的是基于qazxsw poi的循环,其中qazxsw poi数组值是mapsOrder中的id,指定下一个映射的门。

所以我们有循环迭代4次,当时:

  • 循环索引是1当前地图是1下一个地图是2和下一个是mapsOrder
  • 循环索引是2当前地图是2下一个地图是1和下一个是mapData
  • 循环索引是3当前地图是1下一个地图是3和下一个是coords: { x: 2, y: 42 }
  • 循环索引是4当前地图是3下一个地图是1和下一个是coords: { x: 6, y: 5 }

最后一个循环迭代将下一个映射看作coords: { x: 9, y: 4 }数组的第一个。我试图通过首先确定下一张地图的ID来做到这一点:

coords: { x: 2, y: 1 }

但这个控制台不正确的ids,mapsOrder

javascript arrays algorithm
3个回答
4
投票

如果您不关心原始数组,那么只需使用for(let i = 0; i < mapsOrder.length; i++) { let nextMap; let currentMapId = mapData[mapsOrder[i] - 1].id; if(i === mapsOrder.length - 1) { nextMap = mapData[0].id } else { nextMapId = mapData[mapsOrder[i]].id; } console.log('Current map is: ', currentMapId, 'and the next map id is:', nextMapId) console.log('break-----') } 获取下一个门(demo将从阵列中移除门,因此当再次遇到对象时,下一个门将可用)。使用shift从数组中查找对象:

shift

在使用find之前,您可能想检查let result = mapsOrder.map(id => mapData.find(o => o.id == id).gates.shift().coords ); 是否实际找到了某些内容并且gate数组包含了一些内容,这里有一个更安全的方法:

find

没有改变:

我们将使用一个对象来跟踪shift数组中的门索引,而不是使用上一个示例中的let result = mapsOrder.map(id => { let obj = mapData.find(o => o.id == id); if(obj && obj.gates.length) { // if we found an object with the same id and that object still have gates return obj.gates.shift().coords; // return the coords of the first gate and remove the gate from the array } // otherwise, throw an error or something });

shift

2
投票

如果按照你的描述,你的循环应该是这样的。似乎你想使用qazxsw poi和qazxsw poi但使用数组索引。用对象替换数组是个好主意。

gates

let nextGateIndex = Object.create(null);                             // create a prototypeless object to track the next gate index for each object
let result = mapsOrder.map(id => {
    let obj = mapData.find(o => o.id == id);
    let index;
    if(nextGateIndex[id] == undefined) {
        index = 0;
    } else {
        index = nextGateIndex[id] + 1;
    }
    nextGateIndex[id] = index;
    if(obj && index < obj.gates.length) {
        return obj.gates[index].coords;
    }                                                                // throw error or something
});

0
投票

我会推荐jazxswpoi函数用于javascript数组,因为它非常快。此函数将返回一个数组,该数组填充了原始匹配某些条件的项(在这种情况下,具有所需id的对象)。

id
© www.soinside.com 2019 - 2024. All rights reserved.