我的目标是students
&我想得到最年轻学生的名字。
const students = [
{ name: 'Hans', age: 3 },
{ name: 'Ani', age: 7 },
{ name: 'Budi', age: 10 },
{ name: 'Lee', age: 13 }
]
我这个年龄最小的
function getYoungestAge(data) {
return resultMin = data.reduce((min, p) => p.age < min ? p.age : min, data[0].age)
}
getYoungestAge(students) // return 3
我不仅可以返回年龄而且还可以返回姓名? // example: 3 and Hans
答案 0 :(得分:2)
您始终可以通过reduce
而不仅仅是年龄
const students = [
{ name: 'Hans', age: 3 },
{ name: 'Ani', age: 7 },
{ name: 'Budi', age: 10 },
{ name: 'Lee', age: 13 }
]
function getYoungestAge(data) {
return data.reduce((min, p) => p.age < min.age ? p : min, data[0])
}
var youngest = getYoungestAge(students)
console.log(youngest);
&#13;
另一种方法是对列表进行排序并采用第一种方法。注意:这种方式更改原始数组。在某些情况下这很好,在其他情况下则不合需要。在大多数情况下,我更喜欢上面的第一种方式。
const students = [
{ name: 'Hans', age: 3 },
{ name: 'Ani', age: 7 },
{ name: 'Budi', age: 10 },
{ name: 'Lee', age: 13 }
]
function getYoungestAge(data) {
data.sort( (x,y) => x.age-y.age);
return data[0];
}
var youngest = getYoungestAge(students)
console.log(youngest);
&#13;
另请注意,这些解决方案的两个都会返回年龄最小的第一个项目,其中超过1个学生的年龄相同。
答案 1 :(得分:2)
您可以返回包含已过滤对象的数组。这适用于单循环,如果有些人具有相同的最小年龄,则返回所有具有该年龄的人。
function getYoungestAge(data) {
return data.reduce(function (r, o, i) {
if (!i || o.age < r[0].age) {
return [o];
}
if (o.age === r[0].age) {
r.push(o)
}
return r;
}, []);
}
const students = [{ name: 'Hans', age: 3 }, { name: 'Ani', age: 7 }, { name: 'Budi', age: 10 }, { name: 'Lee', age: 13 }]
console.log(getYoungestAge(students));
&#13;
答案 2 :(得分:0)
将数组缩小为Map,年龄为key
,值为所有具有该年龄的学生的数组。要获得最年轻的,请找到地图键的min,并get地图中该键的值:
const students = [{"name":"Hans","age":3},{"name":"Ani","age":7},{"name":"Morgan","age":3},{"name":"Budi","age":10},{"name":"Lee","age":13}]
const studentsByAgeMap = students.reduce((m, o) => {
m.has(o.age) || m.set(o.age, [])
m.get(o.age).push(o)
return m
}, new Map())
const result = studentsByAgeMap.get(Math.min(...studentsByAgeMap.keys()))
console.log(result)
&#13;
答案 3 :(得分:0)
使用Lodash可以在一行中实现上述目标。
_.minBy(学生,函数(o){return o.age})