我有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次,当时:
mapsOrder
mapData
coords: { x: 2, y: 42 }
coords: { x: 6, y: 5 }
最后一个循环迭代将下一个映射看作coords: { x: 9, y: 4 }
数组的第一个。我试图通过首先确定下一张地图的ID来做到这一点:
coords: { x: 2, y: 1 }
但这个控制台不正确的ids,mapsOrder
如果您不关心原始数组,那么只需使用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
如果按照你的描述,你的循环应该是这样的。似乎你想使用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
});
我会推荐jazxswpoi函数用于javascript数组,因为它非常快。此函数将返回一个数组,该数组填充了原始匹配某些条件的项(在这种情况下,具有所需id的对象)。
id