在对象数组中查找最小值并返回其他属性的最佳方法?

时间:2018-02-08 08:40:12

标签: javascript arrays ecmascript-6

我的目标是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

4 个答案:

答案 0 :(得分:2)

您始终可以通过reduce而不仅仅是年龄

来获取整个对象

&#13;
&#13;
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;
&#13;
&#13;

另一种方法是对列表进行排序并采用第一种方法。注意:这种方式更改原始数组。在某些情况下这很好,在其他情况下则不合需要。在大多数情况下,我更喜欢上面的第一种方式。

&#13;
&#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;
&#13;
&#13;

另请注意,这些解决方案的两个都会返回年龄最小的第一个项目,其中超过1个学生的年龄相同。

答案 1 :(得分:2)

您可以返回包含已过滤对象的数组。这适用于单循环,如果有些人具有相同的最小年龄,则返回所有具有该年龄的人。

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:0)

将数组缩小为Map,年龄为key,值为所有具有该年龄的学生的数组。要获得最年轻的,请找到地图键的min,并get地图中该键的值:

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:0)

使用Lodash可以在一行中实现上述目标。

_.minBy(学生,函数(o){return o.age})