在对象数组中查找最大值

时间:2018-10-21 14:54:42

标签: javascript typescript

我有一个看起来像这样的对象:

peaks = 
0: {intervalId: 7, time: 1520290800000, value: 54.95125000000001}
1: {intervalId: 7, time: 1520377200000, value: 49.01083333333333}

以此类推。

如何找到具有peak值的Max? 我试图这样做

this.loadPeak = peaks.map(a => Math.max(a.value));

但是我只是得到了一堆带有value的峰数组(而不是所有的intervalId,时间,值),而不是最大值。

**非常感谢大家,每个解决方案都在奏效,可惜不能接受所有解决方案。 **

4 个答案:

答案 0 :(得分:1)

简单的方法就是使用循环:

this.loadPeak = null;
for (const peak of peaks) {
    if (!this.loadPeak || peak.value > this.loadPeak.value) {
        this.loadPeak = peak;
    }
}

实时示例:

const peaks = [
  {intervalId: 7, time: 1520290800000, value: 54.95125000000001},
  {intervalId: 7, time: 1520377200000, value: 49.01083333333333}
];

let loadPeak = null;
for (const peak of peaks) {
    if (!loadPeak || peak.value > loadPeak.value) {
        loadPeak = peak;
    }
}
console.log(loadPeak);

与几乎所有数组操作一样,如果愿意,您可以将其插入reduce调用中

this.loadPeak = peaks.reduce((maxPeak, peak) => !maxPeak || maxPeak.value < peak.value ? peak : maxPeak, null);

const peaks = [
  {intervalId: 7, time: 1520290800000, value: 54.95125000000001},
  {intervalId: 7, time: 1520377200000, value: 49.01083333333333}
];

const loadPeak = peaks.reduce((maxPeak, peak) => !maxPeak || maxPeak.value < peak.value ? peak : maxPeak, null);
console.log(loadPeak);


我应该早些时候意识到这是一个重复的问题。我找到了重复目标,将其标记为CW答案。

答案 1 :(得分:1)

您只能传播Math.maxvalue值。

var peaks = [{ intervalId: 7, time: 1520290800000, value: 54.95125000000001 }, { intervalId: 7, time: 1520377200000, value: 49.01083333333333 }]
    max = Math.max(...peaks.map(({ value }) => value)),
    object = peaks.find(({ value }) => value === max);

console.log(max);
console.log(object);

答案 2 :(得分:1)

您可以按值的降序对peaks进行排序,然后选择排序后的数组中的第一个。

let peaks = [{
    intervalId: 7,
    time: 1520290800000,
    value: 54.95125000000001
  },
  {
    intervalId: 7,
    time: 1520377200000,
    value: 49.01083333333333
  }
]

let sortedPeaks = peaks.sort((a, b) => b.value - a.value)

let loadPeak = sortedPeaks[0];

console.log(loadPeak);

答案 3 :(得分:1)

对数组进行排序的主要问题是,它会导致整个数组进行许多不必要的迭代。数组越大,速度就越慢,进行排序以尝试上下移动元素。使用reduce(),我们可以以最少的步骤来处理此问题,如果当前元素的值大于先前的值,则只需替换先前的值即可:

var peaks = [
  {intervalId: 7, time: 1520290800000, value: 54.95125000000001},
  {intervalId: 7, time: 1520377200000, value: 49.01083333333333}
];

const maxPeak = peaks.reduce((p, c) => p.value > c.value ? p : c);

console.log(maxPeak);