Собираем массив объектов 5/5


#1

Ффух, это было посложнее, но тоже сдалось =) пока что как вы понимаете лишь кривая реализация, жду оптимизаторов в комменты

тут понятнее
const getData = function(keysArray, arrayOfDataArrays) {
  let array = [];
  for (let i = 0; i < arrayOfDataArrays.length; i++) {
    let obj = {};
    for (let j = 0; j < keysArray.length; j++) {
      if (arrayOfDataArrays[i][j]){
      obj[keysArray[j]] = arrayOfDataArrays[i][j];
      }
    }
    array.push(obj);
  }
  return array;
}
тут поменьше итераций
const getData = function(keysArray, arrayOfDataArrays) {
  let array = [];
  for (let i = 0; i < arrayOfDataArrays.length; i++) {
    let obj = {};
    for (let j = 0; j < keysArray.length && arrayOfDataArrays[i][j]; j++) {
      obj[keysArray[j]] = arrayOfDataArrays[i][j];
    }
    array.push(obj);
  }
  return array;
}

#2

Спасибо за приведенное решение.

Расскажите, пожалуйста, как вы пришли к такому решению?

В частности, что проверяет эта:

if (arrayOfDataArrays[i][j]){
      obj[keysArray[j]] = arrayOfDataArrays[i][j];
      }

проверка и как она работает?


#3

Если вам не трудно, объясните, еще, пожалуйста, решение, что было приведено одним из комментаторов в задании. Вот решение:

var getData = function (keys, values) {
  var newArray = [];

  for (var i = 0; i <= values.length - 1; i++) {

    var newObject = {};
    
    if (values[i].length - 1 <= keys.length - 1) {
      var length = values[i].length - 1;
    } else {
      length = keys.length - 1
    }

    for (var j = 0; j <= length; j++) {
      newObject[keys[j]] = values[i][j];
    }
    
    newArray.push(newObject);
  }
  
  return newArray
};

В частности, что делает проверка:

 if (values[i].length - 1 <= keys.length - 1) {
          var length = values[i].length - 1;
        } else {
          length = keys.length - 1
        }

И как устроен цикл:

 for (var j = 0; j <= length; j++) {
          newObject[keys[j]] = values[i][j];
        }

— что он перебирает?


#4

тут будет тяжко =)

рассмотрим 1ую итерацию внешнего цикла, на которой рассматривается 1ый массив из “массива массивов”
условие: пока есть элементы в этом массиве, мы перебираем ключи (внутренним циклом-j) и каждому ключу присваиваем соответствующий элемент массива (1ый ключ - 1 элем. массива, 2ой ключ - 2 элем. массива и т.д., пока не кончатся элементы массива). Соответственно если у нас кончились ключи, мы не сможем создать свойство объекта без ключа и ограничение в количестве элементов массива тоже выполняется (как исходное условие). Когда объект полностью наполнился ключами, он добавляется в массив array последним элементом.

на второй итерации внешнего цикла-i создается 2ой объект и т.д.

про чалика:
внутренний цикл тот же, что и у меня, с той лишь разницей, что значение length у него переменное, а именно придуман костыль:
перебрать ключи либо до длины мелкого массива значений, либо перебрать ключи до длины массива ключей, смотря что из этого будет меньше. Решение такое я считаю неоптимальным по той причине, что массив может быть очень интересной длины: к примеру, он может быть длиной 9 элементов, а реально в нем будет 0 элементов. выглядит он так: [,,,,,,,,]
то есть, будет не пустой объект, а объект с ключами и неопределенными значениями. Странно, что разрабы курса не добавили такой нюанс в проверку =)
попробуйте вызвать функцию с моим кодом и его кодом вот так:

getData(["name","growth","weight","age"],
[["Пётр","165","70"],["Василий","170"],["Светлана"], [,,,,,,,,]]);

и поймете разницу, о которой речь


#5

Возьмем для примера такие аргументы:

  • keysArray (массив ключей) — [“sea”,“country”,“city”]
  • arrayOfDataArrays (массив значений) — [[“Балтийское”,“Эстония”,“Силламяэ”],[“Охотское”,“Россия”,“Охотск”],[“Жёлтое”,“Китай”,“Бэйдайхэ”]].

Если я правильно понял, то работает это так:

Есть 2 цикла: внешний —

for (let i = 0; i < arrayOfDataArrays.length; i++) {
}

и внутренний —

for (let j = 0; j < keysArray.length; j++) {
}

Внешним циклом перебираются массивы в массиве «arrayOfDataArrays», а именно:
1-ая итерация, когда i = 0 — выбирается массив значений [“Балтийское”,“Эстония”,“Силламяэ”], после чего начинает работать внутренний цикл — начинается перебор ключей из массива «keysArray», а именно: [“sea”,“country”,“city”], и, пока в массиве значений [“Балтийское”,“Эстония”,“Силламяэ”] есть элементы — за этот момент в коде отвечает вот этот участок:

if (arrayOfDataArrays[i][j])

— пока выполняется это условие (пока в массиве значений [“Балтийское”,“Эстония”,“Силламяэ”] есть элементы) мы присваиваем ключам [“sea”,“country”,“city”] значения из массива [“Балтийское”,“Эстония”,“Силламяэ”] и записываем формируемую коллекцию в объект:

obj[keysArray[j]] = arrayOfDataArrays[i][j];

Получается вот такой объект:

{“sea”:“Балтийское”,“country”:“Эстония”,“city”:“Силламяэ”}

После того, как элементы в массиве значений [“Балтийское”,“Эстония”,“Силламяэ”] заканчиваются сформированный объект записывается в массив:

array.push(obj);

На второй внешней итерации берется второй массив значений [“Охотское”,“Россия”,“Охотск”] и начинает работать внутренний цикл — начинается перебор ключей из массива «keysArray», а именно: [“sea”,“country”,“city”], и, пока в массиве значений [“Охотское”,“Россия”,“Охотск”] есть элементы — за этот момент в коде отвечает вот этот участок:

if (arrayOfDataArrays[i][j])

— пока выполняется это условие (пока в массиве значений [“Охотское”,“Россия”,“Охотск”] есть элементы) мы присваиваем ключам [“sea”,“country”,“city”] значения из массива [“Охотское”,“Россия”,“Охотск”] и записываем формируемую коллекцию в объект:

obj[keysArray[j]] = arrayOfDataArrays[i][j];

Получается вот такой объект:

{"sea":"Охотское","country":"Россия","city":"Охотск"}

И так далее.

Верно ли я описал логику работы вашего решения?


#6

да, верно. чекните, я там второй вариант добавил, в первом у меня внутренний цикл вхолостую работал немного


#7

Просьба подсказать по какой причине вылазит ошибка. Спасибо!


#8

valueArr[i][j].length эт чо? сами объяснить сможете?


#9

Спасибо, глупость с недосыпа написал, просьба админов удалить комент выше.