过滤和映射对象数组

时间:2017-07-30 16:01:27

标签: javascript arrays object higher-order-functions



    let team = [
    {'name' : 'Bob Jones', 'Info': {'Height': '6.4', 'Weight': 170}, 'age': 20},
    {'name' : 'John Anderson', 'Info': {'Height': '5.4', 'Weight': 120}, 'age': 23},
    {'name' : 'Tim Hamburger', 'Info': {'Height': '6.1', 'Weight': 180}, 'age': 25},
    {'name' : 'Tom Hamburger', 'Info': {'Height': '6.6', 'Weight': 220}, 'age': 30},
    {'name' : 'Jack Johnson', 'Info': {'Height': '6.0', 'Weight': 190}, 'age': 41},
    {'name' : 'Tommy Tubbs', 'Info': {'Height': '6.1', 'Weight': 180}, 'age': 50},
    ]
    
    let age = (team) => {
      let earlyTwenties = [];
      team.filter((members) => {
        if(members.age >= 20 && members.age <= 25) {
          earlyTwenties.push(members.name)
        }
      });
      return earlyTwenties;
    }
    
    console.log(age(team));//[ 'Bob Jones', 'John Anderson', 'Tim Hamburger' ]
&#13;
&#13;
&#13;

我有一个功能可以过滤所有二十出头的团队成员。我需要仅返回团队成员的名字而不是他们的全名。

我知道我可以使用for-loop并拆分每个名称,然后使用另一个for循环返回所有其他值,为我提供所有名字,但我尝试使用HOF编写更好的代码。

有关如何使用map拆分数组并在同一函数中只返回名字的任何建议吗?

3 个答案:

答案 0 :(得分:3)

您可以使用Array#filter首先让每个符合条件的玩家年龄,然后Array#map使用字符串拆分来获取他们的名字。

let team = [
{'name' : 'Bob Jones', 'Info': {'Height': '6.4', 'Weight': 170}, 'age': 20},
{'name' : 'John Anderson', 'Info': {'Height': '5.4', 'Weight': 120}, 'age': 23},
{'name' : 'Tim Hamburger', 'Info': {'Height': '6.1', 'Weight': 180}, 'age': 25},
{'name' : 'Tom Hamburger', 'Info': {'Height': '6.6', 'Weight': 220}, 'age': 30},
{'name' : 'Jack Johnson', 'Info': {'Height': '6.0', 'Weight': 190}, 'age': 41},
{'name' : 'Tommy Tubbs', 'Info': {'Height': '6.1', 'Weight': 180}, 'age': 50},
];

let res = team.filter(v => v.age > 19 && v.age < 26)
              .map(v => v.name.split(" ")[0]);
              
console.log(res);

答案 1 :(得分:0)

您可以使用map并为每个名称拆分空格并返回第一个元素:

age(team).map(fullname => fullname.split(" ")[0])

&#13;
&#13;
let team = [
{'name' : 'Bob Jones', 'Info': {'Height': '6.4', 'Weight': 170}, 'age': 20},
{'name' : 'John Anderson', 'Info': {'Height': '5.4', 'Weight': 120}, 'age': 23},
{'name' : 'Tim Hamburger', 'Info': {'Height': '6.1', 'Weight': 180}, 'age': 25},
{'name' : 'Tom Hamburger', 'Info': {'Height': '6.6', 'Weight': 220}, 'age': 30},
{'name' : 'Jack Johnson', 'Info': {'Height': '6.0', 'Weight': 190}, 'age': 41},
{'name' : 'Tommy Tubbs', 'Info': {'Height': '6.1', 'Weight': 180}, 'age': 50},
]

let age = (team) => {
  let earlyTwenties = [];
  team.filter((members) => {
    if(members.age >= 20 && members.age <= 25) {
      earlyTwenties.push(members.name)
    }
  });
  return earlyTwenties;
}

console.log(age(team));

console.log(
  age(team).map(fullname => fullname.split(" ")[0])
)
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以先获取所有对象,然后仅将对象的名字映射为结果集。

{{1}}