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

нет, не правильно. это просто проверка на существование элемента в массиве массивов.

Так а как она работает. Можете навести пример с индексами? Спасибо

Есть косяки в реализации?)

const getData = function(keys, dataArrays)
{
  let objectsArray = [];
  
  for (let i = 0; i < dataArrays.length; i++)
  {
    let object = {};
    
    for (let j = 0; j < dataArrays[i].length && j < dataArrays.length; j++)
    {
      object[keys[j]] = dataArrays[i][j];
    }
    objectsArray[i] = object;
  }
  
  return objectsArray;
}

Кстати, да, тут не сразу очевидная проблема возникает. Я сначала тоже запутался и не понял причин. Судя по всему, по какой-то причине “JSON.string”, или чем код проверяет страницу, не выводит пустые ключи, хотя массив действительно не соответствует необходимому результату, как у вас верно замечено.
Как по мне, для новичка это может вызвать вполне закономерные трудности. Я выбрал подсказку “Звонок другу” и мы вместе разрулили этот вопрос, без обращения даже к форуму. Но как по мне, было бы понятнее если бы в ответе выводился тот код, который действительно должен появиться.
Так то решение проблемы неверного массива всего одной строкой реализуется.

1 лайк

Мой вариант:
let getData = (arrKey,arrValue) =>{
class arrayToObject{constructor(){}
setKey(a,i){
a.forEach((el,j) => {
(arrKey[j]!=undefined && arrKey[j]!=undefined)? this[arrKey[j]] = a[j]:’’})}
}
return arrValue.map((a,i)=>{let b = new arrayToObject(); b.setKey(a,i); return b});
};

var getData = function (keys,values) {
   var array = []; // Создаем пустой массив
   for (var i=0; i<values.length; i++) { // Начинаем собирать массив
     var object = {} // Создаем пустой объект
     for (var j=0; (j<keys.length)&&(j<values[i].length); j++) { //СБОРКА ОБЪЕКТА Начинаем собирать объект
         object[keys[j]] = values[i][j]; // Cопоставляем j-тому ключю j-тое значение i-того объекта
      }
      array.push(object); // Собранный объект добавляем в массив объектов
   }
return array; // Возвращаем в кач-ве значения ф-ции собранный массив объектов
}
/* Обратите внимание на дополнительное условие выхода из цикла при СБОРКЕ ОБЪЕКТА: цикл прекращается, и в случае, если кончились ключи (а значения тем не менее еще имеются), и в случае, когда ключи не кончились, но значений для них больше нет!*/

1 лайк

Подсмотрел у @Hierumo вариант с if (arrayOfDataArrays[i][j]) и переписал чуть свой, а то было : if (i < values.length)
Вышло вот так (В целом повторяет логику первого решения все того же @Hierumo ):

Давно не спойлер
function getData(arrKey, arrValue) {
 let arrObg =[]; 
 for ( values of arrValue) {
   let obg = {};
  for (let i = 0; i < arrKey.length; i++ ) {
    if (values[i]) {
   obg[arrKey[i]] = values[i]
    }
   }
   arrObg.push(obg)
  } return arrObg
}
var getData = function(arrKey, arrValues) {
  var newArr = [];
    for(var i = 0; i < arrValues.length; i++) {
      var arrValuesIndex = arrValues[i];
      var obj = {};
      for (var j = 0; j < arrValuesIndex.length; j++) {
        var arrKeyIndex = arrKey[j];
        if(arrKey[j] != undefined) {
          obj[arrKeyIndex] = arrValuesIndex[j];
        } 
      }
    newArr.push(obj);
    }
  return newArr;
}
var getData = function(arrKeys, arrValues) {  
  var arr = [];   
  var getObj = function(j) {
     var obj = {};
     for(var i = 0; i < arrKeys.length; i++) {       
              for(var m = 0; m < arrKeys.length; m++) {
                if(arrValues[j][m]) {
                  obj[arrKeys[m]] = arrValues[j][m];
                }                                    
              }
      }         
    return obj;   
  };  
  for(var x=0; x<arrValues.length; x++) {  
    arr.push(getObj(x));    
  }    
  return arr;  
};

function getKey(arrKeys,arrData){
var obj = {}
for (var i =0;i<arrKeys.length;i++){
var key=arrKeys[i]
obj[key]=arrData[i]
}
return obj
}

  function getData(arrKeys,arrData){
   var arr=[]
for (var i=0 ;i<arrData.length;i++){
      arr[i] =getKey(arrKeys,arrData[i])
      }
  return arr

}

почему на второй проверке выдает ошибку?

Добрый день!
Во втором тесте в массиве с параметрами некоторые из параметров отсутствуют. Ваш код добавляет отсутствующие параметры со значением undefined:
{name: "Светлана", growth: undefined, weight: undefined, age: undefined}
А должен игнорировать эти параметры:
{name: "Светлана"}

Вот как получилось.

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

Я немного глупый, но вот (помогите оптимизировать, пожалуйста):

var getData = function(keys, data) {
  var persons = [];
  for (var i = 0; i < data.length; i++) {
    var personData = data[i];
    var object = {};
    for (var j = 0; j < personData.length; j++) {
      if (keys[j] === undefined) {
        break;
      }
      object[keys[j]] = personData[j];
    }
    persons.push(object);
  }
  return persons;
}

Относительно недавно начал учить JavaScript. Условия, массивы, функции - вроде всё понятно было… На прохождении объектов почувствовал неутолимую тягу к алкоголю, хотя что странно, не пью. Ввожу по мере прохождения курса что нужно - зелёная галочка не появляется. После попытки 17-ой уже жмякаю “Показать ответ” - И ВУАЛЯ!!! Все в точности как сам написал, появляется в решении. Ну вот В ТОЧНОСТИ все как сам написал, проверял с Ctrl + C, Ctrl + V. Подскажите, слабый комп/интернет может быть тому причиной? А то белочка уже шкребется в гости, если понимаете о чем я

1 лайк

Добрый день!

В таких случаях должно помочь нажатие кнопки “Проверить на сервере”. Насильно отправляем на проверку и получаем результат.

1 лайк
let getData = function (keys, data) {
  let result = [];
  for (let i = 0; i < data.length; i += 1) {
    let values = data[i];
    let obj = {};

    let iterator = keys;
    if (values.length < keys.length) {
      iterator = values;
    }

    for (let j = 0; j < iterator.length; j += 1) {
      let key = keys[j];
      let value = values[j];
      obj[key] = value;
    }

    result.push(obj);
  }
  return result;
};

Получилось так. Проверка пройдена, но есть ощущение, что что-то могла упустить.

let getData = function (keys, dataArrays) {
let newArray = [];
for (let i = 0; i < dataArrays.length; i++) {
let currentObj = {};
for (let j = 0; j < keys.length; j++) {
if (dataArrays[i][j]) {
currentObj[keys[j]] = dataArrays[i][j];
}
}
newArray.push(currentObj);
}
return newArray;
}

let getZippedArrays = (key,value)=>Object.assign(...key.map((elem,index)=>
({[elem]: value[index]})))
let getZippedArrays = (key,value)=>Object.fromEntries(key.map((elem,index)=>
([elem, value[index]])))