如何使用一个数组过滤对象数组并创建另一个数组?-Javascript

如何使用一个数组过滤对象数组并创建另一个数组?-Javascript,javascript,arrays,Javascript,Arrays,这是我的密码 var people = [ {name:'Sam', age: 22}, {name:'Pam', age: 24}, {name:'Adam', age: 25}, {name:'Sam', age: 26}, {name:'Pam', age: 28}, {name:'Pam', age: 26} ]; var nameFilter = ['Sa

这是我的密码

 var people = [
          {name:'Sam', age: 22},
          {name:'Pam', age: 24},
          {name:'Adam', age: 25},
          {name:'Sam', age: 26},
          {name:'Pam', age: 28},
          {name:'Pam', age: 26}
  ];

  var nameFilter = ['Sam', 'Pam'];
使用名字,我想得到相应的年龄

我应该将所有这些值作为一个年龄数组来获取

[22,26,24,28,26]

我不想要唯一的值

使用Vanilla JS实现这一点最简单的方法是什么。我不想使用Lodash或Jquery,您可以使用:

filter()
方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素

与:

includes()
方法确定数组的条目中是否包含某个值,并根据需要返回true或false

以及:

map()

var people=[{姓名:'Sam',年龄:22},
{姓名:'Pam',年龄:24},
{姓名:'Adam',年龄:25},
{姓名:'Sam',年龄:26},
{姓名:'Pam',年龄:28},
{姓名:'Pam',年龄:26}
];
var nameFilter=['Sam','Pam'];
var res=people.filter(p=>nameFilter.includes(p.name)).map(p=>p.age)

控制台日志(res)您可以使用
filter()
includes()
map()

var people=[{姓名:'Sam',年龄:22},
{姓名:'Pam',年龄:24},
{姓名:'Adam',年龄:25},
{姓名:'Sam',年龄:26},
{姓名:'Pam',年龄:28},
{姓名:'Pam',年龄:26}
];
var nameFilter=['Sam','Pam'];
让ages=people.filter(person=>nameFilter.includes(person.name)).map(x=>x.age);
控制台日志(ages)
var people=[{姓名:'Sam',年龄:22},
{姓名:'Pam',年龄:24},
{姓名:'Adam',年龄:25},
{姓名:'Sam',年龄:26},
{姓名:'Pam',年龄:28},
{姓名:'Pam',年龄:26}
];
var nameFilter=['Sam','Pam'];
函数getValues(数组、aname){
var tmp=[];
对于(var i=0;ilog(getValues(people,nameFilter))
您可以使用
数组
类型的
过滤器
方法:

然后使用
map
提取年龄

在您的示例中,您将执行以下操作:

people
  .filter(e => nameFilter.indexOf(e.name) >= 0)
  .map(e => e.age)

更具可读性的方法可能是已经建议过的方法,使用
filter
map
。但是,如果希望在一次迭代而不是两次迭代中执行,还可以使用以下方法:

let ages = people.reduce(
  (acc, {name, age}) => (nameFilter.includes(name) && acc.push(age), acc)
  , []);

console.log(ages); // [ 22, 24, 26, 28, 26 ]
请注意,由于您将
nameFilter
作为数组,因此
includes
的大O可能处于最坏的场景O(n);如果你用一个普通的对象替换它,你将得到O(1)。比如:

  let nameFilter = {"Sam": true, "Pam": true};

  let ages = people.reduce(
    (acc, {name, age}) => (nameFilter[name] && acc.push(age), acc)
    , []);
如果您对两个唯一值以及它们在原始数组中出现的次数感兴趣,您还可以将返回值从数组更改为对象:

  let nameFilter = {"Sam": true, "Pam": true};

  let ages = people.reduce(
    (acc, {name, age}) => (nameFilter[name] && (acc[age] = -~acc[age]), acc)
    , {});

  console.log(ages) // { 22: 1, 24: 1, 26: 2, 28: 1 }
在这种情况下,您还可以快速检查是否有具有特定年龄的人,或者有多少人:

  var ageInput = "21";
  if (!ages[ageInput]) {
     console.log(`No one ${ageInput} years old!`)
  } else if ages[ageInput] === 1 {
     console.log(`Only one person is ${ageInput} years old`);
  } else {
     console.log(`There are ${age[ageInput]} people that are ${ageInput} years old`)
  }

当然,这实际上取决于您需要如何处理所获得的数据。

您尝试了什么?