Почему эта функция JavaScript не возвращает несколько объектов из цикла for? - PullRequest
0 голосов
/ 21 сентября 2019

Я хочу создать функцию, которая возвращает несколько объектов из массива, но возвращает только объект из индекса [1].В этом for loop есть ошибка?Я попытался поместить возврат в цикл, он тоже возвращает только один объект.

function Me(arr) {
  var person = {}
  var year = new Date().getFullYear()
  for (var i = 0; i < arr.length; i++) {
    console.log(i + 1 + ". " + arr[i][0] + " " + arr[i][1] + " :")
    person["firstName"] = arr[i][0]
    person["lastName"] = arr[i][1]
    person["gender"] = arr[i][2]
    person["age"] = arr[i][3]
    if (arr[i][3] === undefined) {
      person.age = "Invalid Birth Year"
    } else {
      person.age = year
    }
  }
  return person;
}

console.log(Me([
  ['Christ', 'Evans', 'Male', 1982],
  ['Robert', 'Downey', 'Male']
]));
// 1. Christ Evans:
// { firstName: 'Christ',
//   lastName: 'Evans',
//   gender: 'Male',
//   age: 37 }
// 2. Robert Downey:
// { firstName: 'Robert',
//   lastName: 'Downey',
//   gender: 'Male',
//   age: 'Invalid Birth Year' }
console.log(Me([]));

Ответы [ 3 ]

1 голос
/ 21 сентября 2019

Чтобы ответить на ваш вопрос, почему вы получаете только один объект, давайте посмотрим на ваш код:

function Me(arr) {
  var person = {}
  // for-loop removed
  return person;
}

Вы возвращаете только один объект.И он будет иметь данные последней итерации вашего цикла.

Еще одна вещь с вашим циклом for:

for (var i = 0; i < arr.length; i++) {
  person["firstName"] = arr[i][0]
  person["lastName"] = arr[i][1]
  // more code removed
}

Вы можете сделать цикл for таким, но есть и лучшиепути.Обратите внимание, как вы используете arr[i] каждый раз, когда получаете доступ к объекту?Это очень неэффективно.Один из способов сделать код более читабельным - получить значение в верхней части цикла: let item = arr[i];Но есть и лучшие способы перебора массива.Есть 'forEach , but in this case map` лучше, так как похоже, что вы хотите отобразить значения в массиве в новый массив, с объектом с данными из первого массива.

Я использую Array.prototype.map для итерации по массиву.

"use strict";
function Me(arr) {
  let currentYear = new Date().getFullYear();
  return arr.map( item => ({
    firstName : item[0],
    lastName : item[1],
    gender: item[2],
    age : item[3] === undefined ? "Invalid Birth Year" : currentYear - item[3]
  }) )
}

console.log(Me([['Christ', 'Evans', 'Male', 1982], ['Robert', 'Downey', 'Male']]));

Если вам не разрешено использовать карту, но вы должны использовать цикл for, вы можете сделать это следующим образом:

"use strict";
function Me(arr) {
  var output = []; // starts with an empty array
  var currentYear = new Date().getFullYear();
  
  for ( var i = 0; i < arr.length; i+=1 ) {
    var item = arr[i];
    output.push({
      firstName : item[0],
      lastName : item[1],
      gender: item[2],
      age : item[3] === undefined ? "Invalid Birth Year" : currentYear - item[3]
    })
  }
  
  return output;
}

console.log(Me([['Christ', 'Evans', 'Male', 1982], ['Robert', 'Downey', 'Male']]));
0 голосов
/ 21 сентября 2019
function Me(arr) {
    var person = {}
    // this person variable is used to store the person information generated in each iteration by our for loop

    let personList = [] 
    // personList variable store the data of each person

    var year = new Date().getFullYear()
    for (var i = 0; i < arr.length; i++) {        
        console.log(i + 1 + ". " + arr[i][0] + " " + arr[i][1] + " :")
        person["firstName"] = arr[i][0]
        person["lastName"] = arr[i][1]
        person["gender"] = arr[i][2]
        person["age"] = arr[i][3]
        if (arr[i][3] === undefined) {
        person.age = "Invalid Birth Year"
        } else {
        person.age = year
        }

        personList.push({...person});
        // as for each iterator our loop generate a person now we have to push that person in personList

        // {...person} this is the spread operator syntax to this helps us to make a copy of person object and push that copy in personList.

    }
    return personList;
    // finally returing the personList having persons data
}

console.log(Me([
    ['Christ', 'Evans', 'Male', 1982],
    ['Robert', 'Downey', 'Male']
]));

Приведенный выше код может решить вашу проблему.

Примечание: мы используем spread operator для создания новой копии нашего исходного объекта person и помещаем этот новый объект в personList, мыне использовал ту же ссылку person для вставки personList, потому что на каждой итерации person свойства объекта изменяются и влияют на personList и, следовательно, влияют на наш результат.

0 голосов
/ 21 сентября 2019

Почему бы не использовать что-нибудь попроще, например

const returnVal = [["Christ", "Evans", "Male", 1982], ["Robert", "Downey", "Male"]].map(person => {
return {
  firstName: person[0],
  lastName: person[1],
  gender: person[2],
  age: person[3] === undefined ? "Invalid Birth Year": person[3]
};

});

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