У меня есть массив, содержащий пары ключ-значение. Ключи (ID, Lat, Lon).
То, что я пытаюсь сделать, это сравнить текущий идентификатор элемента со следующим идентификатором элемента, и если они равны, поместите Lat и Lon текущего элемента в объект (в моем случае "точка") и вызовите функцию (InjectIntoArray в этой точке, которая инициализирует глобальные точки массива []).
Когда условие становится ложным (т.е. Текущий идентификатор не равен следующему id), в другой части я помещаю текущие элементы Lat и Lon в объект и вызывая функцию на этом, это связано с тем, что идентификатор следующего элемента будет отличаться и я должен получить все Lat и Lon текущего идентификатора элемента.
Проблема возникает, когда последний элемент проверяется, он выходит без получения последней записи (например, list [lastElement]).
Как я могу получить Lat и Lon из всех элементов? Есть ли лучший способ достичь этого?
Вот мой массив -
var list = [
{ id: 100, Lat: 19.25, Lon: 74}, { id: 100, Lat: 19.79, Lon: 74.19 },
{ id: 101, Lat: 19.99, Lon:75.10 }, { id: 101, Lat: 20.37, Lon:68.9},
{ id: 119, Lat: 17, Lon: 70 }, { id: 107, Lat: -16, Lon: -165 },
{ id: 107, Lat: -15, Lon: -150 }
];
И code-
for (let i = 0; i < list.length - 1;i++) {
if (list[i].id == list[i+1].id) {
var point = { LATITUDE: list[i].Lat, LONGITUDE: list[i].Lon };
InjectIntoArray(point);
}
else {
var point = { LATITUDE: list[i].Lat, LONGITUDE: list[i].Lon };
InjectIntoArray(point);
plotRoute(false,2);
points = [];
}
}
Я думаю, лучше всего использовать функцию уменьшения:
var list = [ // list from the example in original question
{ id: 100, Lat: 19.25, Lon: 74}, { id: 100, Lat: 19.79, Lon: 74.19 },
{ id: 101, Lat: 19.99, Lon:75.10 }, { id: 101, Lat: 20.37, Lon:68.9},
{ id: 119, Lat: 17, Lon: 70 }, { id: 107, Lat: -16, Lon: -165 },
{ id: 107, Lat: -15, Lon: -150 }
];
allRoutes = list.reduce(function(routes,e){
if (!routes[e.id]) routes[e.id] = [];
routes[e.id].push({LATITUDE: e.Lat, LONGITUDE: e.Lon});
return routes;
}, {})
таким образом вы получаете объект со всеми "маршрутами", назначенными их идентификаторам.
{
100: [{ "LATITUDE": 19.25, "LONGITUDE": 74 },
{ "LATITUDE": 19.79, "LONGITUDE": 74.19 }],
101: [{ "LATITUDE": 19.99, "LONGITUDE": 75.1 },
{ "LATITUDE": 20.37, "LONGITUDE": 68.9 }],
107: [{ "LATITUDE": -16, "LONGITUDE": -165 },
{ "LATITUDE": -15, "LONGITUDE": -150 }],
119: [{ "LATITUDE": 17, "LONGITUDE": 70 }]
}
Теперь вы можете перебирать маршруты и строить их по одному, например, следующим образом:
plotRoute = function(r){ console.log('plotting route: ', r) }
Object.values(allRoutes).map(plotRoute)
Приветствия, iPirat
Не уверен, что вы пытаетесь сделать, но как насчет:
for (let i = 0; i < list.length; i++) {
if (i == (list.length - 1)) {
// do what you want to do with the last one
}
else if (list[i].id == list[i+1].id) {
var point = { LATITUDE: list[i].Lat, LONGITUDE: list[i].Lon };
InjectIntoArray(point);
}
else {
var point = { LATITUDE: list[i].Lat, LONGITUDE: list[i].Lon };
InjectIntoArray(point);
plotRoute(false,2);
points = [];
}
}
Глобальные переменные - довольно плохая практика, и, не видя больше кода, сложнее реорганизовать больше, но один вариант должен состоять в том, чтобы иметь постоянную переменную, указывающую, что текущий id
повторяется. Когда id
изменяется, вызовите plotRoute
и переназначьте points
. Используйте forEach
и разрушите аргументы для уменьшения синтаксического шума:
let currentId = null;
function setupNewId(id) {
currentId = id;
plotRoute(false,2);
points = [];
}
list.forEach(({ id, Lat: LATITUDE, Lon: LONGITUDE }) => {
if (id !== currentId) setupNewId(id);
InjectIntoArray({ LATITUDE, LONGITUDE });
});
Как вы можете видеть, здесь мы переназначаем points
и вызываем plotRoute
в начале новой итерации, а не в конце, поэтому нет проблем, связанных с тем, что у вас было.
points
, и единственная разница вplotRoute