L oop над массивом объектов, возвращающих массив - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь вернуть массив каждого из имен в массиве объектов, которые удовлетворяют условию в операторе if. Не могли бы вы помочь мне понять, почему мой код возвращает только имя, когда условие выполнено? Моя цель - вернуть массив всех имен объектов, которые удовлетворяют условию в операторе if.

function getNamesOfLegalDrivers(people){
  for(let i =0; i < examplePeopleArray.length; i++){
    if(examplePeopleArray[i].age > 15) {
      return examplePeopleArray[i].name
    }
  }
}

const examplePeopleArray = [
  { name: 'John', age : 14},
  { name : 'Joey', age : 16},
  { name : 'Jane', age: 18}
];

console.log(getNamesOfLegalDrivers(examplePeopleArray))

Ответы [ 3 ]

4 голосов
/ 31 января 2020

Когда вы начинаете строку с возврата, она завершает функцию (аналогично тому, как прерывание заканчивается al oop).

function getNamesOfLegalDrivers(people){
  let returnArray = [];
  let numberOfDrivers = people.length;
  for(let i =0; i < numberOfDrivers; i++){
    if(people[i].age > 15) {
      returnArray.push(people[i].name)
    }
  }
   return returnArray;
}

const examplePeopleArray = [
  { name: 'John', age : 14},
  { name : 'Joey', age : 16},
  { name : 'Jane', age: 18}
];

console.log(getNamesOfLegalDrivers(examplePeopleArray))
2 голосов
/ 31 января 2020

Это происходит потому, что вы возвращаете первое вхождение, которое вы встретите в этом утверждении:

return examplePeopleArray[i].name

Если вы хотите сохранить этот лог c, вы должны сохранить желаемый результат в массив, а затем вернуть окончательный массив вне для для l oop:

function getNamesOfLegalDrivers(people){
let names = [];
  for(let i =0; i < examplePeopleArray.length; i++){
    if(people[i].age > 15) {
      names.push(people[i].name);
    }
  }
  return names;
}

const examplePeopleArray = [
  { name: 'John', age : 14},
  { name : 'Joey', age : 16},
  { name : 'Jane', age: 18}
];

console.log(getNamesOfLegalDrivers(examplePeopleArray))

Кроме того, более чистый способ достичь того же результата будет:

function getNamesOfLegalDrivers(people){
    return people.filter(person => person.age > 15).map(person => person.name);
}

const examplePeopleArray = [
  { name: 'John', age : 14},
  { name : 'Joey', age : 16},
  { name : 'Jane', age: 18}
];

console.log(getNamesOfLegalDrivers(examplePeopleArray))

Во-первых, Вы фильтруете возраст более 15 лет и возвращаете результат оператору карты, который обязательно вернет только их имена в массив.

2 голосов
/ 31 января 2020

Это потому, что вы выходите из своей функции после первого раза, если утверждение if верно. return останавливает выполнение функции и возвращает значение.

Вместо этого вам необходимо вернуть все значения после прохождения всего для l oop.

function getNamesOfLegalDrivers(people){
  let drivers = [];
  for(let i=0; i < people.length; i++){
    if(people[i].age > 15) {
      drivers.push(people[i]['name']);
    }
  }
    return drivers;

}
const examplePeopleArray = [
  { name: 'John', age : 14},
  { name : 'Joey', age : 16},
  { name : 'Jane', age: 18}
];

console.log(getNamesOfLegalDrivers(examplePeopleArray));

Также внутри вашей функции вы используете глобальную переменную examplePeopleArray - вы должны использовать переменную people (информация, передаваемая в функцию). В противном случае, если бы вы изменили массив, который вы передали функции (например, второй список драйверов), вы все равно бы смотрели на examplePeopleArray.

...