Клуб API Карт

Пройтись по всем сегментам одного маршрута

Пост в архиве.

Почему этот код не работает?

 

// Поездка по МКАДу
ring = 0;       
route.getPaths().each(function (elem, i) {
    elem.getSegments().each(function (elem, i) {
        if (elem.getStreet() == 'МКАД') {
            ring += elem.getLength();
        }
    });
});

 

Firebug пишет path.getSegments().each is not a function

Почему getPaths() можно обойти функцией each, а getSegments() нельзя? как вообще правильно пройтись по всем сегментам всех путей одного маршрута (точек маршрута может быть от 2 и более)?

  
9 комментариев

 судя по документации возвращается обычный массив

Т.е. вот так?

 

// Поездка по МКАДу
ring = 0;       
route.getPaths().each(function (elem, i) {
    var segments = elem.getSegments();
    for (i = 0; i < segments.length; i++) {
        if (segments[i].getStreet() == 'МКАД') {
            ring += segments[i].getLength();
        }
    }
});

наверное

я бы только удалил отсюда "i"

(function (elem, i) { -> (function (elem) {

ибо она неявно перезаписывается в цикле

а в цикле добавил var

for (var i = 0, len = segments.length; i < len; i++) {

спасибо

Может я конечно не в тему что-то скажу. но сегменты то еще ладно так перебирать, но для определения за мкадом этот сегмент или нет лучше использовать полигон, который будет охватывать весь МКАД,

потом проверять по сегментам их начальные координаты если текущий еще в мкаде а следующий сегмент начинается уже не в полигоне МКАДАзначит мы нашли конец, остается только разрезать этот сегмент (который ни туда ни сюда), и докинуть еще растоение которое относиться к мкаду, так как сегменты могут буть большимы и потерять несколько км не прикольно

 

Ещё вопрос. Почему, у сегментов не всегда выводятся названия? Заметил, что километраж этим циклом считает не всегда, решил проверить:

 

Path #0

[168.63]
2-я Брестская улица [1018.5]
[94.26]
Садовое кольцо [1483.18]
улица Новый Арбат [386.52]
улица Новый Арбат [557]
Новоарбатский мост [405.67]
Кутузовский проспект [8083.37]
2-й Минский путепровод [62.42]
Можайское шоссе [1592.49]
Рябиновая улица [3748.17]
улица Генерала Дорохова [910.92]
[65.65]
[5775.73]
Киевское шоссе [10298.54]
Центральная улица [138.05]
[532.98]
Центральная улица [944.67]
2-я Рейсовая улица [15.33]
2-я Рейсовая улица [280.14]
[620.65]
[647.66]


Path #1

[96.77]
[121.27]
[259.56]
1-я Рейсовая улица [289.35]
1-я Рейсовая улица [15.07]
Центральная улица [1936.32]
[134.02]
[207.86]
Внуковское шоссе [3734.05]
Минское шоссе [10434.64]
Можайское шоссе [380.36]
МКАД [21136.76]
Ленинградское шоссе [1197.59]
улица Маяковского [260.23]
улица Маяковского [273.92]
[191.82]
[107.71]
Пролетарская улица [244.56]
Московская улица [7.85]

 

Почему у сегмента длиной 5775.73 метров не вывелось название? Как с этим бороться?

Алексей Yarrr!
28 января 2016, 03:25

→ Array.prototype.each

← undefined

[].each даже не входит в стандарт ECMAScript, стандартный метод для перебора массива: forEach

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach

метод each у массива может присутствовать в случае, если у вас подключена какая-то библиотека, определяющая Array.prototype.each, но библиотеки обычно приводят к стандарту, а по стандарту это forEach.

Самый лучший вариант для браузера это перебор через for (var i = 0, l = segments.length; --l; ++i), который вы уже используете. Помните только, что такой перебор будет включать в себя все нестандартные для браузера свойства, доопределенные в prototype объекта, по которому вы ходите. Array ведь тоже объект ;-)

 

Самый лучший вариант для браузера это перебор через for (var i = 0, l = segments.length; --l; ++i), который вы уже используете. Помните только, что такой перебор будет включать в себя все нестандартные для браузера свойства, доопределенные в prototype объекта, по которому вы ходите. Array ведь тоже объект ;-)

ты путаешь c for in

 

Алексей Yarrr!
28 января 2016, 03:25

точно. for in использовать не всегда безопасно.