当前位置: 首页 > 知识库问答 >
问题:

在对象数组中的属性中查找具有Max值的所有对象,并从同一对象返回其他属性的值

孙琨
2023-03-14

我知道这里有类似的问题,但是使用这些方法只返回一个max值。我需要的是确定数组的哪些对象在给定属性中具有最大值,并返回在给定属性中具有最大值的那些对象中的某个(其他)属性的值。

我有一个名为week的对象数组,具有两个属性“name”和“traffic”:

[
 { name: "Saturday", traffic: 12 },
 { name: "Sunday", traffic: 12 },
 { name: "Monday", traffic: 13 },
 { name: "Tuesday", traffic: 9 },
 { name: "Wednesday", traffic: 10 },
 { name: "Thursday", traffic: 8 },
 { name: "Friday", traffic: 13 },
]


在本例中,Monday和Friday属性“traffic”的最大值为13,如果只有一天,我需要返回一个包含具有最高“traffic”值的日期名称的字符串,如果具有最高“traffic”值的日期超过一天,则返回一个包含具有最高“traffic”值的日期名称(作为字符串)的数组,就像在本例中返回一个包含Monday和Friday的数组一样。

我试过这个:

function getMaxTr() {
    return week.reduce((max, p) => p.traffic > max ? 
      p.traffic : max, week[0].traffic); 
}

但是我只得到了属性“traffic”的一个最大值,即13。

以及以下内容:

let max = week [week.length - 1];

使用最后一个,我得到一个具有最大流量值的对象,如下所示:

object{name:“friday”,traffic:13}

共有2个答案

慕容齐智
2023-03-14

您可以使用函数reduce对天数进行分组,如果reduce数组仅包含一个元素,则可以使用函数pop对天数进行分组。

null

var array = [ { name: "Saturday", traffic: 12 }, { name: "Sunday", traffic: 12 }, { name: "Monday", traffic: 13 }, { name: "Tuesday", traffic: 9 }, { name: "Wednesday", traffic: 10 }, { name: "Thursday", traffic: 8 }, { name: "Friday", traffic: 13 }],
    reduced = array.reduce((a, {name, traffic}) => {
      if (traffic > a.highest) {
        a.current = [name];    
        a.highest = traffic;    
      } else if (traffic === a.highest) a.current.push(name);
  
      return a;
    }, {highest: 0, current: []}).current,
    result = reduced.length === 1 ? reduced.pop() : reduced;

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
施华奥
2023-03-14

可以使用reduce。在每次迭代中,检查结果中是否有一个元素具有较低或相等的traffice属性,如果是,则替换前一种情况下的所有元素,或将相等元素添加到结果中。如果上面都没有返回true,只需再次返回上次迭代的元素。

null

const arr = [
    { name: "Saturday", traffic: 12 },
    { name: "Sunday", traffic: 12 },
    { name: "Monday", traffic: 13 },
    { name: "Tuesday", traffic: 9 },
    { name: "Wednesday", traffic: 10 },
    { name: "Thursday", traffic: 8 },
    { name: "Friday", traffic: 13 },
];

let res = arr.reduce((a, b) => {
    let now = a.pop();
    if (now.traffic < b.traffic) return [b];
    if (now.traffic === b.traffic) return [...a, now, b];
    return [...a, now];
}, [arr[0]]).map(e => e.name);

res = res.length > 1 ? res : res[0];

console.log(res);
 类似资料:
  • 问题内容: 是否有可能从具有特定属性的数组中获取对象?还是我需要遍历数组中的所有对象并检查属性是否是我正在寻找的特定对象? 编辑:谢谢你给我正确的方向,但我有一个转换此问题。 //再编辑一次:好的,如果只有一个特定的结果?这也是可行的方法吗? 问题答案: //这不起作用-NSArray不是Images的子类型-那么如果只有1种可能的结果怎么办? 您无法在编译时证明数组上只有一个可能的结果。您实际要

  • 如何处理对象的javascript数组,例如: 并通过求和这些值合并重复的键。为了得到这样的东西: 我尝试过迭代并添加到一个新数组中,但这没有起到作用:

  • 问题内容: 我想从数组中的每个对象中删除该属性。有没有比使用循环并从每个对象中删除它更好的方法了? 似乎应该有一种使用方式,或其他方式。我不知道。有想法吗? 问题答案: 唯一的其他方法是修饰,实际上是循环。 例如 : 笔记: 如果要与IE8兼容,则需要forEach的垫片。正如您提到prototype一样,prototype.js也有一个shim。 是最糟糕的“优化杀手”之一。使用它经常会破坏应用

  • 我想从数组中的每个对象中删除属性。有没有比使用循环并从每个对象中删除它更好的方法? 似乎应该有一种方法来使用或其他东西。我不知道。想法?

  • 问题内容: 我正在寻找一种非常快速,干净且有效的方法来获取以下JSON切片中的最大“ y”值: for-loop是解决此问题的唯一方法吗?我热衷于使用。 问题答案: 要在中找到对象的最大值:

  • 问题内容: 我有一些复杂的对象,例如猫,它具有许多属性,例如年龄,喜爱的猫食等等。 Java集中存储了一堆猫,我需要查找所有3岁的猫,或者最喜欢猫粮的Whiskas。当然,我可以编写一个自定义方法来查找那些具有特定属性的Cat,但是这样做会麻烦许多属性。有一些通用的方法吗? 问题答案: 您可以编写一个采用接口实例的方法,该实例定义了一个方法,该方法可以通过所需的任何属性检查来实现。 更好的是,使其