【问题标题】:Find maximum value of property in object of objects查找对象对象中属性的最大值
【发布时间】:2018-07-09 17:12:51
【问题描述】:

我有一个这样的对象:

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

如何检查哪个对象的 "age" 属性值最高,并将该对象设为常量??

我尝试使用 Object.keys(),将数据扔到 Array 并减少,但最后,所有这些方法都没有按我想要的那样工作。我已经在这个问题上纠结了好几个小时了。

【问题讨论】:

  • 如果你得到两个最大年龄相同的人会发生什么?
  • 你可以使用_.maxBy
  • @mpen 我不能使用任何外部库。

标签: javascript loops object data-structures max


【解决方案1】:

您可以使用reduce 函数查找年龄最大的对象。

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

这个解决方案的“关键”是:

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

这是如何工作的:

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

  • reduce 函数将循环键数组,并将保留一个 accumulator(当前最高年龄)和一个 currentValue(来自源数组 Object.keys(users) 的当前项目)。

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

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

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

    • 1234563

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)

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

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

var maxAge;
for(var key in users){
  if(!maxAge || users[key].age > maxAge.age){
    maxAge = users[key];
  }
}

console.log('Highest Age is:');
console.log(maxAge);

【讨论】:

  • 看起来不错,+1。如果 OP 需要,使用循环的解决方案 - jsfiddle.net/wt7q4gtt
  • @IrkenInvader 我可以获取您的代码并将其放入此答案吗?我会提到你。
  • 是的,没问题。
  • 你能不能通过编写伪代码来解释一下我这行是如何工作的:Object.keys(users)。 reduce((acc, curr) => acc.age ? (users[curr].age > acc.age ? users[curr] : acc) : users[curr], {});
【解决方案2】:

您可以将数组作为最大年龄的结果集,因为您可以获得多个具有相同最大年龄的用户。

本提案使用对象的键并对其进行迭代并检查索引是否为零,或者如果最后一个结果用户的年龄小于实际用户,则将具有实际键的新数组作为结果。

如果年龄相等,则将实际用户密钥附加到结果集中。如果没有返回最后的结果。

const
    users = { adam: { age: 28, extraInfo: 'foobar' }, brad: { age: 31, extraInfo: 'foobar' }, jef: { age: 12, extraInfo: 'baarfoo' } },
    maxAge = Object
        .keys(users)
        .reduce((r, k, i) => !i || users[r[0]].age < users[k].age
            ? [k]
            : users[r[0]].age === users[k].age
                ? r.concat(k)
                : r, []);

console.log(maxAge);

【讨论】:

    【解决方案3】:
       Here is code to find highest age object but I am not sure whether you can assign the result to a constant
    
      function highestAge( ageArray ) {
          var highest = null;
          for ( var key in ageArray ) {
                var val = ageArray[key];
                 if( highest != null ) {
                     if ( highest.age < val.age ) {
                          highest = val;
                     }
                 } else {
                     highest = val;
                 }
               }
               return highest;
         }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-08
      • 2014-05-07
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多