Какой самый простой способ вернуть ключ с наибольшим значением в массиве объектов? - PullRequest
0 голосов
/ 08 октября 2019

Я делаю простую RPG и пытаюсь вычислить, какой атрибут должен быть увеличен, когда уровень персонажа повышается. У них есть потенциальный предел для каждого атрибута, и я хочу увеличить атрибут, наиболее удаленный от его потенциала.

Я могу перебрать каждый атрибут и вычесть его текущее значение из его потенциального значения, чтобы получить разницу. Затем я могу выдвинуть разницу в массив. Результат выглядит следующим образом:

[
{Strength: 5},
{Dexterity: 6},
{Constitution: 3},
{Wisdom: 4},
{Charisma: 8}
]

Харизма - это ключ с наибольшей разницей, так как я могу оценить это и вернуть имя ключа (а не само значение)?

РЕДАКТИРОВАТЬ: Вот логика, которая используется для получения массива:

let difference = [];
let key;
for (key in currentAttributes) {
  difference.push({[key]: potentialAttributes[key] - currentAttributes[key]});
};

Ответы [ 3 ]

5 голосов
/ 08 октября 2019

Простое уменьшение с Object.entries

const items = [
  { Strength: 5 },
  { Dexterity: 6 },
  { Constitution: 3 },
  { Wisdom: 4 },
  { Charisma: 8 }
]

const biggest = items.reduce((biggest, current, ind) => {
  const parts = Object.entries(current)[0]  //RETURNS [KEY, VALUE]
  return (!ind || parts[1] > biggest[1]) ? parts : biggest  // IF FIRST OR BIGGER
}, null) 
console.log(biggest[0])  // 0 = KEY, 1 = BIGGEST VALUE

Ваша модель данных немного странна с массивом с объектами, лучшая модель была бы просто объектом.

const items = {
  Strength: 5,
  Dexterity: 6,
  Constitution: 3,
  Wisdom: 4,
  Charisma: 8
}

const biggest = Object.entries(items)
  .reduce((biggest, current, ind) => {
    const parts = current
    return (!ind || parts[1] > biggest[1]) ? parts : biggest  
}, null) 

console.log(biggest[0])
3 голосов
/ 08 октября 2019

Вы можете создать объект, взять записи и уменьшить записи, взяв запись с наибольшим значением. В конце возьмите ключ от записи.

var data = [{ Strength: 5 }, { Dexterity: 6 }, { Constitution: 3 }, { Wisdom: 4 }, { Charisma: 8 }],
    greatest = Object
        .entries(Object.assign({}, ...data))
        .reduce((a, b) => a[1] > b[1] ? a : b)
        [0];

console.log(greatest);
2 голосов
/ 08 октября 2019

Сортировка в порядке убывания и получение первого элемента:

let attributes = [
  {Strength: 5},
  {Dexterity: 6},
  {Constitution: 3},
  {Wisdom: 4},
  {Charisma: 8}
];

//for convenience
const getValue = obj => Object.values(obj)[0];

//sort descending
attributes.sort((a, b) => getValue(b) - getValue(a));

let highest = attributes[0];
console.log(Object.keys(highest)[0]);

В качестве альтернативы, пройдите через массив и найдите наибольшее количество очков:

let attributes = [
  {Strength: 5},
  {Dexterity: 6},
  {Constitution: 3},
  {Wisdom: 4},
  {Charisma: 8}
];

//for convenience
const getValue = obj => Object.values(obj)[0];

//find the highest score
let highest = attributes.reduce((currentHighest, nextItem) => getValue(currentHighest) > getValue(nextItem) ?  currentHighest : nextItem);

console.log(Object.keys(highest)[0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...