5

how to get maximum of value between multiple keys from array?

I have tried this below method for only three(not multiple) keys.

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

But we need to check more condition and write more codes if we use multiple keys. So I have tried these below codes

Math.max.apply(Math, values.map(function (a) { return a[key1], a[key2], a[key3]; }));
                                         // where I want to return multiple keys 

But it's not working. Is any single line of code available for getting max value in between multiple keys from array?

4
  • Kindly explain who's/why down voted for this question. :( Commented Jun 23, 2017 at 11:28
  • 2
    I don't know if this is the reason, but perhaps the question seems basic for a user of your reputation. I'm not saying that it is, or that it's a legit reason for downvoting, only that from my experience sometimes downvotes, in as much as some of them make sense, are on occasion related to reputation in relation to content, as well as just content itself. (I did not downvote and I very rarely do, but I know that others are less reticent). Or maybe someone lost their keys (I don't find this reason for voting funny, but I know it's community accepted as being funny). Commented Jun 23, 2017 at 11:36
  • @PeterDavidCarter ! it's a large comment than below answers :p Commented Jun 23, 2017 at 11:57
  • 1
    Yeah, it's probably a good question in that it's got a lot of answers so probably produced useful content for the community. I think it's fine. meta.stackexchange.com/questions/215379/… contains the answer I was refering to when referencing lost keys. (My formal training was first in literature so I have a tendency to ramble on ;)). Commented Jun 23, 2017 at 11:59

3 Answers 3

7

Array#map each object to it's maximum value, then find the maximum of the array:

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

If you want something more flexible that can accept multiple keys:

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

Sign up to request clarification or add additional context in comments.

5 Comments

Is it working for multiple objects? like if we go to use key3?
@RameshRajendran your question wasn't very clear on that point
@RameshRajendran - The array I've presented has multiple objects with multiple properties. Can you add an example to your code?
OOPS! I have mentioned objects instead of keys. forgive me! I have updated my question
@RameshRajendran - I've a added a solution for multiple keys.
2

(plain ES6 - I don't do TypeScript)

Given your object values and a set of keys that you wish to compare, e.g.:

let values = [
   { key1: 2, key2: 3, key3: 0 },
   { key1: 10, key2: 0, key3: 5 }
];

then for each key, find the maximal value within each object and return that as an array, and then find the maximal value of that array.

function getMaxValuefromkeys(values, ...keys) {
    return Math.max(...keys.map(key => Math.max(...values.map(o => o[key]))));
}

with usage:

let max = getMaxValuefromkeys(values, 'key1', 'key2', 'key3');

or given an array of keys:

let max = getMaxValuefromkeys(values, ...keys);

3 Comments

yeah! typescript answer for awesome. But my question is why we using map() for the keys instead of values?
@RameshRajendran you have to map over the keys to get their individual values.
*1 for answered in typescript :)
0
Math.max.apply(Math, values.map(function (a) { return Math.max(a[key1],a[key2]) }));

Note that

return a,b;

Is the comma operator , so actually it just returns b.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.