在对象数组中查找最大值

use*_*222 7 javascript typescript

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

peaks = 
0: {intervalId: 7, time: 1520290800000, value: 54.95125000000001}
1: {intervalId: 7, time: 1520377200000, value: 49.01083333333333}
Run Code Online (Sandbox Code Playgroud)

等等。

我如何发现peakMax有价值?我试着这样做

this.loadPeak = peaks.map(a => Math.max(a.value));
Run Code Online (Sandbox Code Playgroud)

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

**非常感谢大家,每个解决方案都有效,遗憾的是不能全部接受。**

Fra*_*erZ 9

对数组进行排序的主要问题是它会导致数组中进行许多不必要的迭代。数组越大,这会显着变慢,排序以尝试上下移动元素。使用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);
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 6

您只能传播 的valueMath.max

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);
Run Code Online (Sandbox Code Playgroud)


T.J*_*der 2

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

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

实例:

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

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

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

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);
Run Code Online (Sandbox Code Playgroud)


我应该早点意识到这是一个重复的问题。我找到了 dupetarget,对其进行了标记,并将其设为 CW 答案。