2017-01-25 19 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から55まで、39から83,9、150から150、12、1を求めています。長さの違う例があるはずです。

+0

ザッツない配列の配列を、オブジェクトリテラルの配列のthats。 – max

+2

@max実際には**は**(オブジェクトの)配列の配列です。 –

+0

True @torazaburo – max

答えて

5

Array#forEach方法でArray#reduceメソッドを使用します。 ES6 arrow function

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ループです。 FYI

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


:ES6で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

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; 
    })); 
}); 
関連する問題