在对象的对象中查找属性的最大值

p7a*_*ams 0 javascript loops object max data-structures

我有一个这样的对象:

const users = {
 adam: {
   age: 28,
   extraInfo: 'foobar',
 },
 brad: {
   age: 31,
   extraInfo: 'foobar',
 },
 jef: {
   age: 12,
   extraInfo: 'baarfoo',
 },
};
Run Code Online (Sandbox Code Playgroud)

如何检查哪个对象具有“ age”属性的最高值并将该对象设为常量?

我尝试过使用Object.keys(),将数据抛出到Array并进行减少,但最后,所有这些方法都无法按我的意愿工作。我已经在这个问题上停留了几个小时。

Ele*_*Ele 5

您可以使用reduce函数查找寿命最长的对象。

基本上,该reduce函数将users使用其键循环对象,并将根据age值更改累加器。

该解决方案的“关键”是:

const result = Object.keys(users). reduce((acc, curr) =>    
   acc.age ? (users[curr].age > acc.age ? users[curr] : acc) : users[curr], {});
Run Code Online (Sandbox Code Playgroud)

工作原理:

  • Object.keys(users):在您的情况下,此函数从特定对象返回键数组["adam", "brad", "jef"]

  • reduce函数将循环键数组,并保持accumulator(当前最高年龄)和currentValue(源Array中的当前项Object.keys(users))。

  • acc.age ? (users[curr].age > acc.age ? users[curr] : acc) : users[curr], {})该条件计算的电流值accumulatorcurrentValue

    • 要求,acc.age因为reduce函数以空的initialValue开头{}

      用作首次调用回调的第一个参数的值。如果未提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用reduce()是错误的。

    • 如果acc.age具有以前的值,则此条件(users[curr].age > acc.age ? users[curr] : acc) : users[curr]将在accumulator 和之间进行currentValue选择(选择最高年龄)。

const result = Object.keys(users). reduce((acc, curr) =>    
   acc.age ? (users[curr].age > acc.age ? users[curr] : acc) : users[curr], {});
Run Code Online (Sandbox Code Playgroud)

@irkeninvader使用for-loop以下方法建议的解决方案:

const users = {
  adam: {
    age: 28,
    extraInfo: 'foobar',
  },
  brad: {
    age: 31,
    extraInfo: 'foobar',
  },
  jef: {
    age: 12,
    extraInfo: 'baarfoo',
  },
};

const result = Object.keys(users).reduce((acc, curr) =>    
       acc.age ? (users[curr].age > acc.age ? users[curr] : acc) : users[curr], {});

console.log(result)
Run Code Online (Sandbox Code Playgroud)