从每个对象数组中获取最大值

6

我有这样的数据:

data = [
         [{a: "b", value: 12}, {a: "bb", value: 39}, {a: "bb", value: 150}],
         [{a: "c", value: 15}, {a: "cc", value: 83}, {a: "ccc", value: 12}],
         [{a: "d", value: 55}, {a: "dd", value: 9}, {a: "dd", value: 1}]
       ]

我希望获取每个对象数组中值的最大值。因此,结果应该像这样:
maxValues = [150, 83, 55]

现在我的代码是:

let maxValues = []
let tmp;
let highest = Number.NEGATIVE_INFINITY;

data.map((eachArr, index) => {
  for(let i = eachArr.length -1; i >= 0; i--){
    tmp = eachArr[i].value;
    if(tmp > highest) highest = tmp;
  }
  maxValues.push(highest)
})

并且结果是:
maxValues = [150, 150, 150]

我该如何实现这个目标?

5
您的真实代码中是否存在语法错误(每个对象都没有关闭 } 字符),还是这只是笔误? - David Thomas
数据 = [ [{a: "b", value: 12}, {a: "bb", value: 39}, {a: "bb", value: 150}], [{a: "c", value: 15}, {a: "cc", value: 83}, {a: "ccc", value: 12}], [{a: "d", value: 55}, {a: "dd", value: 9}, {a: "dd", value: 1}] ] - Pranav Patel
1
似乎是打错了...我建议修改...如果不是,那么用户就有更大的问题了! - Exception_al
2
@Addy:我看到并拒绝了那个编辑:请不要在问题中“纠正”代码(除非OP明确确认某个错别字),在许多情况下,错别字可能是问题的原因,更改或更正代码会隐藏提问的原因。 (另外,我回滚了被批准的编辑,但这真的与个人无关。) - David Thomas
一切清楚了...我会记住的。 - Exception_al
显示剩余2条评论
5个回答

20
你可以使用 扩展语法 并取得映射的 value 的最大值。

扩展语法 允许表达式在多个参数(用于函数调用)、多个元素(用于数组字面量)或多个变量(用于解构赋值)所需的位置进行展开。

var data = [[{ a: "b", value: 12}, {a: "bb", value: 39 }, {a: "bb", value: 150 }], [{ a: "c", value: 15}, {a: "cc", value: 83 }, {a: "ccc", value: 12 }], [{ a: "d", value: 55}, {a: "dd", value: 9 }, {a: "dd", value: 1 }]],
    result = data.map(a => Math.max(...a.map(b => b.value)));

console.log(result);


4
我知道你最近已经发布了这篇文章,但你能否花些时间解释一下代码的作用和工作原理呢?这样做可以帮助未来的读者更好地使用。顺便说一句,写得非常好! :) - David Thomas
我也会感激一下解释,这就像是樱桃上的奶油,可以省去我搜索如何工作的时间。-) - Exception_al
扩展运算符 ... 并不难理解,她包含了链接,别偷懒啊 :D - Trash Can

7

你需要在forEach函数内部包含let highest = Number.NEGATIVE_INFINITY;,因为你需要从array中的每个集合中设置highest

data = [
         [{a: "b", value: 12}, {a: "bb", value: 39}, {a: "bb", value: 150}],
         [{a: "c", value: 15}, {a: "cc", value: 83}, {a: "ccc", value: 12}],
         [{a: "d", value: 55}, {a: "dd", value: 9}, {a: "dd", value: 1}]
       ]
let maxValues = []
let tmp;
data.forEach((eachArr, index) => {
  let highest = Number.NEGATIVE_INFINITY;
  for(let i = eachArr.length -1; i >= 0; i--){
    tmp = eachArr[i].value;
    if(tmp > highest) highest = tmp;
  }
  maxValues.push(highest)
})
console.log(maxValues);


1
这里滥用了 map。代码应该使用 forEach,或者实际上使用 map 的结果(例如,let maxValues = data.map(...);,其中回调返回 highest)。 - T.J. Crowder

4

使用 Math.max.apply()Array.prototype.map() 函数的 Ecmascript 5 解决方案:

var data = [
    [{a: "b", value: 12}, {a: "bb", value: 39}, {a: "bb", value: 150}],
    [{a: "c", value: 15}, {a: "cc", value: 83}, {a: "ccc", value: 12}],
    [{a: "d", value: 55}, {a: "dd", value: 9}, {a: "dd", value: 1}]
];

var maxValues = data.map(function (arr) {
    return Math.max.apply(null, arr.map(function(o){ return o.value; }));
});

console.log(maxValues);

Math.max.apply()函数可以返回给定数字中的最大值。这些数字是通过Array.prototype.map()函数累加的,每个嵌套对象的value属性即为该数字。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max


1
虽然代码很好,但是一个有用的答案应该解释你做了什么以及为什么这样做。 - T.J. Crowder

3
使用 Array#map 迭代数组,生成数组元素。使用 Array#reduce 查找包含最大值的对象,然后检索其值属性。请保留 HTML 标签。
data.map(arr => arr.reduce((a, b) => a.value < b.value ? b : a).value)

data = [
  [{
    a: "b",
    value: 12
  }, {
    a: "bb",
    value: 39
  }, {
    a: "bb",
    value: 150
  }],
  [{
    a: "c",
    value: 15
  }, {
    a: "cc",
    value: 83
  }, {
    a: "ccc",
    value: 12
  }],
  [{
    a: "d",
    value: 55
  }, {
    a: "dd",
    value: 9
  }, {
    a: "dd",
    value: 1
  }]
]

console.log(
  data.map((arr) => arr.reduce((a, b) => a.value < b.value ? b : a).value)
)


没有 ES6 箭头函数

data.map(function(arr){
  return arr.reduce(function(a, b){
    return a.value < b.value ? b : a
  }).value;
});

2
使用下划线最大函数 没有ES6
_(data).map( function (item){
   var max = _(item).max( function( hash ){ return hash.value })
   return max.value
});

使用ES6
_(data).map((item) => _(item).max(( hash ) => hash.value).value);    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接