2017-01-25 1 views
3

У меня есть данные, как это:Как получить максимальное значение в том же индексе в массиве массивов?

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 из 12, 15, 55, 83 из 39, 83, 9 и 150 из 150, 12, 1. Я сожалею, что не был конкретным. У меня должен быть пример разной длины.

+0

То не массив массивов, тот массив литералов объектов. – max

+2

@max На самом деле, это ** - это массив массивов (объектов). –

+0

True @torazaburo – max

ответ

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), []) 
 
)


Использование простой для цикла с той же логикой.

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


FYI:Performance comparison

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