从对象数组中获取只包含匹配键值的数组

5

假设我有一个对象数组:

var students = [{name: 'Nick',achievements: 158,points: 1473}, {name: 'Nick',achievements: '175',points: '16375'}, 
{name: 'Ramon',achievements: '55',points: '2025'}];

我希望从数组中仅提取名字为Nick的点。
例如,如果(name == 'Nick'),则输出应为[1473,16375]。
我尝试过:
var arrayPoints = students.map(function (el) { 
    if(el.name=='Nick'){
        return el.points
    }
});

但它给我输出:

console.log(arrayPoints)

[1473,16375,undefined] o/p
3个回答

4

了解这些方法:

  • Array#map 为每个元素返回一个(新的)值。

  • Array#filter 如果回调函数的返回值是truthy,则返回该元素本身。


你可以采取两步,一步用于筛选项目,另一步用于获取值。

const
    students = [{ name: 'Nick', achievements: 158, points: 1473 }, { name: 'Nick', achievements: '175', points: '16375' }, { name: 'Ramon', achievements: '55', points: '2025' }],
    arrayPoints = students
        .filter(student => student.name === 'Nick') 
        .map(student => student.points);

console.log(arrayPoints);

如果实现了Array#flatMap,你可以使用单个循环和过滤器来返回一个值。
空数组没有任何项,这个数组是一个中性值,在结果数组中不会出现。

const
    students = [{ name: 'Nick', achievements: 158, points: 1473 }, { name: 'Nick', achievements: '175', points: '16375' }, { name: 'Ramon', achievements: '55', points: '2025' }],
    arrayPoints = students
        .flatMap(student => student.name === 'Nick'
            ? student.points
            : []
        );

console.log(arrayPoints);


2

如果要得到没有 undefined 的单个循环结果,可以使用Array#reduce方法。

students.reduce(function (acc,el) { 
    if(el.name=='Nick'){
        acc.push(el.points)
    }
    return acc
},[]);

2
你可以使用reduce来实现:
reduce()方法会对数组中的每个元素执行一个reducer函数(由你提供),从而得到单个的输出值。
因此,你可以使用它来检查名字是否确实为Nick(el是当前的值)。
如果是,则将分数推送到累加器(即arr)中。
[]表示传递给reduce函数的initialValue。
var arrayPoints = students.reduce((arr, el) => 
    (el.name === 'Nick' && arr.push(el.points), arr), [])  

您可以在此处找到有关reduce的更多信息:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接