Проблемы с Предметом в Объекте, являющимся неопределенным - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь отсортировать и сгруппировать массив объектов. Но я сталкиваюсь с проблемой, когда при вызове имени ключа «Драйвер» возвращается значение «неопределенное».

Код выглядит следующим образом:

let hos = [
    {
        "Driver": "test-000000",
        "Date": "3/15/2020",
        "Status": "Off-Duty",
        "Time": "12:00 AM",
        "": "",
        "__1": "",
        "__2": ""
    },
    {
        "Driver": "test-000000",
        "Date": "3/16/2020",
        "Status": "Off-Duty",
        "Time": "12:00 AM",
        "": "",
        "__1": "",
        "__2": ""
    }
];

let hosByDriver = [];

hos.forEach((item, index) => {
// If the current item.Driver string match the previous or next '.Driver' push it to an array inside hosByDriver[targetedDriver] else push it by itself
    if (item.Driver == hos[index + 1].Driver || item.Driver == hos[index - 1].Driver) {
        hosByDriver[item.Driver].push(item);
    } else {
        hosByDriver[item.Driver].push(item);
    }
});

1 Ответ

1 голос
/ 18 марта 2020

В первой итерации (индекс 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. Это также может доставить вам много хлопот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...