我在只有三个(不是多个)键时尝试过以下方法。
getMaxValuefromkeys(values: any[], key1: string, key2: string, key3: string) {
var val1 = Math.max.apply(Math, values.map(function (a) { return a[key1] }));
var val2 = Math.max.apply(Math, values.map(function (a) { return a[key2]; }));
var val3 = Math.max.apply(Math, values.map(function (a) { return a[key2]; }));
if (val1 >= val2 || val1 >= val3) {
return val1;
} else if (val2 >= val3 || val2 >= val1) {
return val2;
}
return val3;
}
但是如果我们使用多个键,我们需要检查更多条件并编写更多代码。所以我尝试了以下代码
Math.max.apply(Math, values.map(function (a) { return a[key1], a[key2], a[key3]; }));
// where I want to return multiple keys
但它没有用。是否有任何一行代码可用于从数组中获取多个键之间的最大值?
答案 0 :(得分:4)
Array#map
每个对象的最大值,然后找到数组的最大值:
var values = [{ a: 4, b: 3 }, { a: 2, b: 8 }, { a: 1, b: 2 }];
var key1 = 'a', key2 = 'b';
var result = Math.max.apply(Math, values.map(function (a) { return Math.max(a[key1], a[key2]); }));
console.log(result);
如果您想要更灵活的东西,可以接受多个键:
var values = [{ a: 4, b: 3, c: 23 }, { a: 2, b: 28, c: 13 }, { a: 1, b: 2, c: 1 }];
function getMaxOfKeys(values, keys) {
return Math.max.apply(Math, values.map(function(obj) {
return Math.max.apply(Math, keys.map(function(key) {
return obj[key];
}));
}));
}
// or the ES6 equivalent
const getMaxOfKeysES6 = (values, keys) =>
Math.max(...values.map(
(obj) =>
Math.max(...keys.map((key) => obj[key]))
)
);
console.log(getMaxOfKeys(values, ['a', 'b', 'c']));
console.log(getMaxOfKeysES6(values, ['a', 'b', 'c']));
答案 1 :(得分:1)
(简单的ES6 - 我不做TypeScript)
根据您要比较的对象values
和一组keys
,例如:
let values = [
{ key1: 2, key2: 3, key3: 0 },
{ key1: 10, key2: 0, key3: 5 }
];
然后对于每个键,找到每个对象中的最大值并将其作为数组返回,然后找到该数组的最大值。
function getMaxValuefromkeys(values, ...keys) {
return Math.max(...keys.map(key => Math.max(...values.map(o => o[key]))));
}
用法:
let max = getMaxValuefromkeys(values, 'key1', 'key2', 'key3');
或给出一组键:
let max = getMaxValuefromkeys(values, ...keys);
答案 2 :(得分:0)
Math.max.apply(Math, values.map(function (a) { return Math.max(a[key1],a[key2]) }));
请注意
return a,b;
逗号运算符,实际上只返回b。
答案 3 :(得分:0)
你也可以在map函数中使用三元运算并返回值
Math.max.apply(Math, values.map(function (a) { return (a[key1] >= a[key2]) ? a[key1] : a[key2] ; }));
var values = [{ a: 4, b: 3 }, { a: 2, b: 8 }, { a: 1, b: 2 }];
var key1 = 'a', key2 = 'b';
var result = Math.max.apply(Math, values.map(function (a) { return (a[key1] >= a[key2]) ? a[key1] : a[key2] ; }));
console.log(result);