В первой итерации (индекс 0) ваш код выглядит следующим образом
hos.map((item, index) => {
console.log(index);
// neither hos[1] nor hos[-1] do exist -> undefined
if (item.Driver == hos[0+1] || item.Driver == hos[0-1].Driver) {
hosByDriver[item.Driver].push(item);
} else {
hosByDriver[item.Driver].push(item);
}
});
Так что он падает в самом первом раунде. hos[0-1].Driver
оценивается как undefined.Driver
. Вы можете обойти это, используя && .
Примечание: массив [-1] не является недопустимым синтаксисом
hos[index - 1] && hos[index - 1].Driver
Кроме того, item. Драйвер - это строка. Массивы обычно индексируются по номеру. Я думаю, что вы хотели использовать объект вместо этого:
let hosByDriver = {};
hos.forEach((item, index) => {
console.log(index);
if (hos[index - 1] && (item.Driver === hos[index + 1] || item.Driver === hos[index - 1].Driver)) {
//hosByDriver[item.Driver] = [];
//hosByDriver[item.Driver].push(item);
} else {
hosByDriver[item.Driver] = [];
hosByDriver[item.Driver].push(item);
}
});
Я также изменил .map на .forEach, потому что вы не возвращаете новый массив, который исключает карта. forEach является эквивалентом, если вы просто хотите повторить.
Я только догадываюсь, чего вы хотите достичь, если вы предоставите более подробную информацию, я могу предоставить лучшее решение. Взгляните на эту кодовую коробку:
https://codesandbox.io/s/stackoverflow-3h2n9
Я думаю, вам нужно прочитать немного об основах JavaScript (таких как типы данных, циклы, и др c). Тем не менее, продолжайте учиться! :)
Обновление: Если я правильно понял, вы не хотите группировать драйверы в hosByDriver с тем же именем, хранящимся в hos. Сценарий использования должен был бы получить доступ ко всем элементам драйвера, например hosByDriver['test-000000']
, и избежать итерации по всему массиву и снова и снова, что имеет смысл.
Этого легко добиться, выполнив
let hosByDriver = {};
hos.forEach(item => {
// if item or item.Driver could be not what you expect you could check with
// item && item.Driver && typeof item.Driver === "string"
// in your if statement
if(!hosByDriver[item.Driver]){
// set hosByDriver[item.Driver] to empty array if it is undefined (more precisly: if its [falsy][1], meaning either 0, "", undefined, null ,NaN or false
hosByDriver[item.Driver] = []
}
// append item to array at hosByDriver[item.Driver]
// either empty or holding previous items
hosByDriver[item.Driver].push(item);
});
Информация:
В JavaScript Массивы на самом деле являются просто объектами (парами ключ / значение). Если вы хотите узнать больше об этом, вы можете посмотреть JavaScript: Понимание странных деталей . Массивы - это особый случай, когда вы получаете доступ к значению с номером, начинающимся с нуля, хотя я думаю, что вы можете в любом случае поставить строки - потому что JavaScript очень простителен - я бы не рекомендовал этого. Когда он станет более сложным, у вас будет трудная отладка.
Также не рекомендуется использовать ==, вместо этого используйте === для предотвращения JS -Двигатель пытаясь сделать преобразование типов. Например, 0 == ""
дает true
. Это также может доставить вам много хлопот.