如何使用一个数组过滤对象数组并创建另一个数组?-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;i log(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`)
}
当然,这实际上取决于您需要如何处理所获得的数据。您尝试了什么?