【问题标题】:Loop over an array of objects return an array循环对象数组返回一个数组
【发布时间】:2020-01-31 00:25:31
【问题描述】:

我正在尝试返回满足 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))

【问题讨论】:

    标签: javascript arrays object javascript-objects


    【解决方案1】:

    当您以 return 开始一行时,它会结束函数(类似于 break 结束循环的方式)。

    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))
    

    【讨论】:

    • 请注意,在此示例中,函数正在更改其范围之外的变量。与其循环遍历全局变量 examplePeopleArray,不如循环遍历传递给函数 (people) 的数组。
    • 你错过了一个...... if 语句:)
    【解决方案2】:

    发生这种情况是因为您返回了在此语句中遇到的第一个匹配项:

    return examplePeopleArray[i].name

    假设您想保留该逻辑,您应该将所需结果存储在一个数组中,然后在 for 循环之外返回最终数组:

    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 岁的年龄并将结果返回给 map 运算符,这将确保只将他们的姓名返回到数组中。

    【讨论】:

    • 请注意,在此示例中,函数正在更改其范围之外的变量。与其循环遍历全局变量 examplePeopleArray,不如循环遍历传递给函数 (people) 的数组。
    【解决方案3】:

    这是因为你在第一次 if 语句为真之后退出你的函数。 return 停止执行函数并返回值。

    相反,您需要在完成整个 for 循环后返回所有值。

    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

    【讨论】:

    • 请注意,您返回的是过滤后的对象,而不是名称
    • 已更正。谢谢。 (实际上,我省略了 return 语句——所以我没有返回任何东西!)
    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2020-06-22
    • 1970-01-01
    • 2022-11-15
    • 2020-06-04
    • 1970-01-01
    相关资源
    最近更新 更多