如何在数组数组中的相同索引处获取最大值?

时间:2017-01-25 05:12:44

标签: 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}]
]

我想获得此数据中相同索引的最大值,因此我希望结果如下:

[55, 83, 150]

现在,我可以获取对象中的每个值,如果指定索引,我可以获得最大值。我不确定如何使用每个索引。

let array = [];
data.map((eachArr, index) => {
   array.push(eachArr[0].value)

   for(let i = 0; i < eachArr.length; i++){
     console.log('eachArr[i].value', eachArr[i].value, i);
   }
})
console.log(Math.max(...array)) ===> 55

我该怎么做?

我认为人们误解了我的问题。我不想要每个数组的最大值。我希望每个数组中具有相同索引的value的最大值。所以我希望55,13,​​55,83分别来自39分,83分,9分和150分,分别是150分,12分,1分。我很抱歉没有具体。我应该有一个不同长度的例子。

3 个答案:

答案 0 :(得分:5)

Array#reduce方法使用Array#forEach方法。

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 }]];


console.log(
  // iterate over the array
  data.reduce(function(arr, ele) {
    // iterate over the inner array
    ele.forEach(function(o, i) {
      // check element present at the index, if not then update with current value
      arr[i] = arr[i] || o.value;
      // check assign greatest value by comparing with previous value
      arr[i] = arr[i] < o.value ? o.value : arr[i];
      
      // you can combine above two lines
      // arr[i] = !arr[i] || arr[i] < o.value ? o.value : arr[i];
      
    });
    // return the array reference
    return arr;
    // set initial value as an empty array
  }, [])
)


// without any comments
console.log(
  data.reduce(function(arr, ele) {
    ele.forEach(function(o, i) {
      arr[i] = !arr[i] || arr[i] < o.value ? o.value : arr[i];
    });
    return arr;
  }, [])
)

使用ES6 arrow function

let 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.reduce((arr, ele) => (ele.forEach((o, i) => arr[i] = !arr[i] || arr[i] < o.value ? o.value : arr[i]), arr), [])
)

<小时/> 使用具有相同逻辑的简单for循环。

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 res = [];

for (var i = 0; i < data.length; i++) {
  for (var j = 0; j < data[i].length; j++) {
    res[j] = !res[j] || res[j] < data[i][j].value ? data[i][j].value : res[j];
  }
} 

console.log(res);

仅供参考: Performance comparison

答案 1 :(得分:4)

这应该这样做。

// Get the maxes from rows
 data.map(function(a){
    return Math.max.apply( null, a.map(function(b){ return b.value; }) );
 });

// Get maxes from cols
var maxes = data.map(function(v,i){
    return Math.max.apply( null, data.map(function(a){
       return a[i].value;
    }));
});
console.log("Maxes: ",maxes);
// Maxes:  [ 55, 83, 150 ]

答案 2 :(得分:1)

在ES6中:

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

const result = data[0].map((_, i) => 
  Math.max(...data.map(subarray => subarray[i].value)));

console.log(result);

请注意,如果子数组的长度不同,则无法正常工作。

如果您更喜欢ES5版本:

const result = data[0].map(function(_, i) {
  return Math.max.apply(null, data.map(function(subarray) {
    return subarray[i].value;
  }));
});