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

时间:2017-01-23 08:41:39

标签: javascript arrays

所以我有这样的数据:

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 个答案:

答案 0 :(得分:18)

您可以使用spread syntax并获取映射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);

答案 1 :(得分:7)

您必须在let highest = Number.NEGATIVE_INFINITY;功能中添加forEach,因为您必须在highest的每一组中设置array

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);

答案 2 :(得分: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()函数将返回给定数字中的最大值。
数字(每个嵌套对象的value属性)通过 Array.prototype.map()功能。

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

答案 3 :(得分:3)

使用Array#map迭代数组,生成数组元素,使用Array#reduce查找包含最大值的对象,然后检索其value属性。

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 arrow function

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

答案 4 :(得分:2)

使用underscore max function

Whitout 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);