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


#19

а можете написать код с какими-то более продвинутыми функциями, которые мы не изучали? reduce sort filter? )


#21

не думаю, что это будет понятный вариант, но добавил вариант 3. Сделал с использованием функции из задания 3/5
ваш код имеет недочеты - переменную obj все же стоит назвать array или arr, это же массив. и еще такой момент, если в массиве данных придет массив с ненулевой длиной и undefined значениями, ваш код обработает его некорректно. т.е. заполнит объект ключами с undefined значениями. что я имею ввиду:
протестируйте вот этот вызов:

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

последним идет как раз тот самый коварный массив с ненулевой длиной и пустыми значениями.

поэтому не понял зачем нужно j < values[i].length , ведь мы должны проверять не на длину массива внутри массива, а на присутствие элемента


#22

Спасибо за поправку.
Уязвимость действительно жёсткая.
Но я тоже хочу внести поправку, я подправил свой код, и использовал даже Ваши решения, но в них тоже есть уязвимость. Создаётся пустой объект. Этого быть не должно. Давайте её решать как-то вместе:

Я предлагаю вот такое рабочее решение. Обратите внимание также на все условия выполнения циклов.

var getData = function (keys, values) {
  var arr = [];
  for (var i = 0; values[i] && values[i].reduce((a,b) => a + b,0); i++ ) {
    arr[i] = {}; 
     for (var j = 0; values[i][j] && keys[j] ; j++ ) {
     arr[i][keys[j]] = values[i][j];
    }
    }
  return arr;
  };

Но в случае если keys тоже состоит из пустых строк, то получим вот такой ответ:

Итоговое рабочее решение:

var getData = function (keys, values) {
  var arr = [];
 
  for (var i = 0; values[i] && keys.reduce((a,b) => a + b,0) && values[i].reduce((a,b) => a + b,0); i++ ) {
    arr[i] = {}; 
     for (var j = 0; values[i][j] && keys[j] ; j++ ) {
     arr[i][keys[j]] = values[i][j];
    }
    } 
  return arr;
  };

console.log(getData([,,,,,,,,],[["Пётр","165","70"],["Василий","170"],["Светлана"],[,,,,,,,,]]));

#23

ну мне кажется пустой объект это ок. типа факт передачи данных есть, но они пустые. например эта программулина могла бы использоваться в системе аутентификации при заходе на сайт, если пользователь ничего не ввел, то пустой объект отражается как посещение без регистрации. т.е. ноунейм пользователь заходил, к примеру. И длина массива была бы как раз количеством уникальных посещений, где пустые объекты, это случайные гости, которых можно отбраковать при желании. для сбора статистики например.
вообще не критично, Кекс не рассказывает для чего это все нужно… :wink:

values[i].reduce((a,b) => a + b,0) вот тут не понял зачем суммировать значения? типа проверить что они не пустые в сумме? ну такое себе, можно же передать [,5,] вот так, и там будет 5. только это не логично, принимать информацию без имени. тогда уж просто values[i][0] - там как раз имя содержится. а если его нет, то и смысла во всем этом тоже.


#24

жду Ваших решений, потому что я начал учить программирование пару недель назад от силы.
Считаю, что все “аварии” надо предусмотреть.


#25

какое решение надо? я ж выше написал. или вы вообще хотите убрать пустой объект и нарушить порядок передачи аргументов?

ну вот тогда
var getData = function (keys, values) {
  var arr = [];
  for (var i = 0; values[i] && values[i][0] ; i++ ) {
    arr[i] = {}; 
     for (var j = 0; values[i][j] && keys[j] ; j++ ) {
     arr[i][keys[j]] = values[i][j];
    }
  } 
  return arr;
};
console.log(getData(["name","growth","weight","age"],[["Пётр","165","70"],["Василий","170"],["Светлана",,,,,],[,,165,,,,,,]]));

#26

Подскажите пожалуйста, правильно ли я понял что при таком коде:
if (kay.length > massivMassiv[i].length) {
kay.length = massivMassiv[i].length;
};
если сначала будет короткий массив а потом длинный то уже будет ошибка, так как kay.length примет значение длины короткого массива. Я имею в виду что при таком массиве
getData([“name”,“growth”,“weight”,“age”],
[[“Пётр”,“165”,“70”],[“Светлана”], [“Василий”,“170”],
kay.length уменьшится до “1” когда дойдет до [“Светлана”] и в следующем покажет только [“Василий”] а не [“Василий”,“170”]. Это так? Или kay.length при следующем круге цикла заново примет изначальное значение?

И второй вопрос я написал прям в коде, что бы было понятней.

Весь код.
var getData = function(kay, massivMassiv) {
var otvetMas = [];
// почему если перенести сюда var otvetObjekt = {}; , то код не работает. Точнее он работает очень странно все объекты в новой матрице становятся как последний, и не понятно почему
for (var i = 0; i < massivMassiv.length; i++) {
var otvetObjekt = {};
for (var j = 0; j < kay.length; j++) {
if (kay.length > massivMassiv[i].length) {
kay.length = massivMassiv[i].length;
};
otvetObjekt[kay[j]] = massivMassiv[i][j];
};
otvetMas[i] = otvetObjekt;
};
return otvetMas;
};


#27
  1. Да верно, затрет значения. Изменять длину массивов таким образом - плохая идея (если конечно мы не говорим об обрезке, но тут лучше применять метод .slice() ). Как вариант - можно создавать буферную переменную на каждой итерации, в которой будет копия массива ключей. Но для этой задачи это не нужно (т.е. не нужно сравнивать длины массивов вообще).
  2. Потому что в таком случае у вас в объекте переписываются только значения ключей, а не пары ключ-значение. Т.е. если подобного ключа нет на данной итерации цикла, то он оставит значение из какой-то из предыдущих итераций. Чтобы этого не происходило, мы в начале каждой новой итерации внешнего цикла затираем объект новым пустым и потом добавляем в него пары ключ-значение.

#28

Решил вот так:

Через reduce
const getData = (arrOfKeys, arrOfArrs) => {
  return arrOfArrs.reduce((acc, el, i) => {
    const element = el.reduce((acc2, el2, j) => {
      if (j < arrOfKeys.length) {
        acc2[arrOfKeys[j]] = el2;
      }
      return acc2;
      }, {});
    return [...acc, element];
    }, []);
};

#29

Я решил это так

function getData (keys, arrays)
  {
    var data = [];
    for (var i = 0; i < arrays.length; i++)
      {
        data[i] = {};
        for (var j = 0; (j < keys.length) && (j < arrays[i].length); j++)
          {
            data[i][keys[j]] = arrays[i][j];
          };
      };
    return data;
  };

#30

Добрый день.
Подскажите, что не так сделал? Выскакивает TypeError : Cannot read property ‘length’ of undefined.

var getData = function(keys, arrayArray){
var obj = {};
for (i = 0; i < keys.length; i++){
for (j = 0; j < arrayArray.length; j++){
if (arrayArray[j][i]){
obj[keys[i]] = arrayArray[j][i];
};
};
};
return obj;
}
getData ();

Спасибо


#31

аргументы в функцию передайте.
у пустого аргумента (undefined) нет свойства length, потому что оно есть только на экземпляре массива или строки, собственно об этом и написано: Cannot read propertylength’ of undefined.

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


#32

Не пойму. По условиям понял. Переделал, вот что получилось:
var getData = function(keys, arrayArray) {
var array = [];
for (var i = 0; i < arrayArray.length; i++){
var obj = {};
for (var j = 0; j < keys.length; j++){
if (arrayArray[i][j] && keys[j]){
obj[keys[j]] = arrayArray[i][j];
}
}
array.push(obj);
}
return array;
}
getData ();

Но вот сама ошибка осталась. Смотрю на второй пример в шапке и в упор не вижу разницы (кроме условия). Ткните пальцем плз.


#33

вы вызываете функцию без аргументов getData();
а должны примерно вот так (с выводом в консоль):

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


#34

Спасибо.


#35

Подскажите, почему не работает вот такой, казалось бы, похожий код? Я не задавала переменную length, а определяла длину через newArray.length. Разве это не одно и то же получается? Ведь мы собираем объект по длине нового объекта, а это и есть newArray.length.

var getData = function (keysArray, dataArray) {
var newArray = [];

for (var i = 0; i < dataArray.length; i++) {

 if (keysArray.length < dataArray[i].length) {
   newArray.length = keysArray.length;
  } else {
   newArray.length = dataArray[i].length;

}

var obj = {};
 
for (var j = 0; j < newArray.length; j++) {
    obj[keysArray[j]] = dataArray[i][j];
}   
newArray.push(obj);

}
return newArray;
}


#36

Можете помочь, когда покупаешь подписку на месяц включается автоплатёж, как его отключить? Потому что в этом месяце я закончу все задания и не хотелось бы чтобы у меня автоматов в след. месяце деньги слетели и так далее. Не знаю куда обратиться, поэтому вам написал. Можете помочь или дать контакты куда мне написать.


#37

@sasha_sm помогите 1tap плиз


#38

Отменить подписку можно вот здесь. Доступ к курсам сохранится до конца оплаченного периода. Будьте внимательны при отмене, там три этапа нужно пройти.


#39

СПАСИБО БОЛЬШОЕ ! Отменил