Как перебрать последний элемент массива при сравнении текущего элемента со следующим элементом?

1

У меня есть массив, содержащий пары ключ-значение. Ключи (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 = [];
  }

}
  • 0
    Это действительно ваш код, который работает за исключением последней части элемента? Похоже, что вы ничего не делаете с points , и единственная разница в plotRoute
  • 0
    Действительно запутанно, один и тот же код существует в условии if и else, почему бы вам не извлечь этот код из обоих условий? Насколько я понимаю, вы не выполняете никаких операций для последнего элемента. Вы должны добавить еще одно условие для построения последнего элемента.
Показать ещё 4 комментария
Теги:
arrays
arrow-functions
iteration

3 ответа

1
Лучший ответ

Я думаю, лучше всего использовать функцию уменьшения:

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

  • 0
    Спасибо, это сработало очень хорошо. Цените все усилия
1

Не уверен, что вы пытаетесь сделать, но как насчет:

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 = [];
     }
}
  • 1
    спасибо, отметьте, я имею в виду этот подход, но мы должны быть в состоянии сделать лучше, чем это.
1

Глобальные переменные - довольно плохая практика, и, не видя больше кода, сложнее реорганизовать больше, но один вариант должен состоять в том, чтобы иметь постоянную переменную, указывающую, что текущий 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 в начале новой итерации, а не в конце, поэтому нет проблем, связанных с тем, что у вас было.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню