如何从数组中获取多个键之间的最大值

Posted

技术标签:

【中文标题】如何从数组中获取多个键之间的最大值【英文标题】:how to get maximum of value between multiple keys from array 【发布时间】:2017-11-26 22:28:21 【问题描述】:

我已经为仅三个(不是多个)键尝试了以下方法。

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 

但它不起作用。是否有任何单行代码可用于从数组中获取 多个 键之间的最大值?

【问题讨论】:

请解释谁/为什么对这个问题投了反对票。 :( 我不知道这是否是原因,但对于您的声誉用户来说,这个问题似乎很基本。我并不是说它是,或者它是投反对票的正当理由,只是根据我的经验,有时投反对票,尽管其中一些是有道理的,但有时与内容相关的声誉有关,以及只是内容本身。 (我没有投反对票,我也很少投反对票,但我知道其他人不那么沉默寡言)。或者也许有人丢失了他们的钥匙(我不觉得这个投票的理由很有趣,但我知道社区认为这很有趣)。 @PeterDavidCarter !这是一个比以下答案大的评论:p 是的,这可能是一个很好的问题,因为它有很多答案,因此可能为社区提供了有用的内容。我认为这很好。 meta.stackexchange.com/questions/215379/… 包含我在引用丢失的密钥时所指的答案。 (我的正式培训首先是文学方面的,所以我有一种漫无边际的倾向;))。 【参考方案1】:

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

【讨论】:

它是否适用于多个对象?比如我们去使用key3 @RameshRajendran 你的问题在这一点上不是很清楚 @RameshRajendran - 我展示的数组有多个具有多个属性的对象。您可以在代码中添加示例吗? 哎呀!我已经提到了keys 的对象instead。原谅我!我已经更新了我的问题 @RameshRajendran - 我为多个键添加了解决方案。【参考方案2】:

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

【讨论】:

是的!打字稿答案真棒。但我的问题是为什么我们使用 map() 作为键而不是值? @RameshRajendran 你必须map 来获取它们各自的值。 *1 用打字稿回答:)【参考方案3】:

你也可以在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);

【讨论】:

我的问题是多个键。不仅仅是两个值 哦,在这种情况下使用@Ori Drori 回答 @RameshRajendran 你的意思是多个键吗? 是的! @Alnitak。【参考方案4】:
Math.max.apply(Math, values.map(function (a)  return Math.max(a[key1],a[key2]) ));

注意

return a,b;

逗号操作符,所以实际上它只是返回b。

【讨论】:

以上是关于如何从数组中获取多个键之间的最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有最大元素的唯一键数组?

如何从java中的数组中打印多个最大值[重复]

从具有 O(n) 的数组中获取最大的时间下降、最小值和最大值

从Awk中的多维数组中的子数组获取最小值和最大值

如何从多维数组中获取每个索引的最大值-javascript

如何从要在 d3.scale.linear().domain() 中使用的对象数组中获取最大值