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

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

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

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

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

ну вот тогда
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,,,,,,]]));

Подскажите пожалуйста, правильно ли я понял что при таком коде:
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;
};

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

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

Через 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];
    }, []);
};

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

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;
  };

Добрый день.
Подскажите, что не так сделал? Выскакивает 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 ();

Спасибо

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

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

Не пойму. По условиям понял. Переделал, вот что получилось:
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 ();

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

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

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

Спасибо.

Подскажите, почему не работает вот такой, казалось бы, похожий код? Я не задавала переменную 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;
}

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

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

2 лайка

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

1 лайк

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

1 лайк

Я считаю что прошлый вызов был посложнее как - то. Этот как - то более очевиден. Но я как не умел писать код “как нормальный пацаны” - так и не умею. Таки придется заниматься с репетитором :neutral_face:

var getData = function (arrKeys, arrArrValues) {
  arrObj = [];
  for (var i=0; i<arrArrValues.length; i++) {
    arrObj[i] = {};
    if (arrArrValues[i].length === arrKeys.length ||
        arrArrValues[i].length < arrKeys.length) {
      for (var j=0; j<arrArrValues[i].length; j++) {
          arrObj[i][arrKeys[j]] = arrArrValues[i][j];
      };
    } else {
      for (var j=0; j<arrKeys.length; j++) {
          arrObj[i][arrKeys[j]] = arrArrValues[i][j];
      };
    };
  }; return arrObj
};

сортировка не может быть сложной в принципе, тем более что для нее есть готовый метод с готовыми вариантами коллбэков

Правильно ли я понял, что в arrayOfDataArrays[i][j] индексы i и j должны иметь одинаковое значение. Например [3][3], а если [3][4], то это означает, что элемента не существует?