我有这样的数据:
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分。我很抱歉没有具体。我应该有一个不同长度的例子。
答案 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;
}, [])
)
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;
}));
});