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

Я хочу сравнить значения из объектов, которые я храню в массиве.

Я знаю, что могу создавать новые массивы со значениями из каждого объекта, но я пытаюсь найти способ сделать это без созданияих.

Учтите, что у нас такая ситуация:

soldiers[first, second, third]
first{name: John, shooting: 95, combat: 50, tactic: 88}
second{name: Arnold, shooting: 97, combat: 72, tactic: 68}
third{name: William, shooting: 87, combat: 86, tactic: 97}

Я бы хотел выбрать лучшего солдата из представленного выше, но я не могу создать один рейтинг (то есть средний).

Будут некоторые условия, которые должен выполнить солдат, например: как минимум 60 очков в бою (независимо от того, будет ли любое другое свойство равным 100).

Поэтому я пытаюсь найти способсравнить несколько свойств и вернуть имя только одного солдата.

Буду признателен за каждый совет.Спасибо!

Ответы [ 3 ]

0 голосов
/ 19 апреля 2019

Вам нужно пройти через все предметы и выбрать лучшее значение;

Обратите внимание, что некоторые солдаты могут иметь аналогичные значения, поэтому values.name это массив

let a = {
    name: "John", shooting: 95, combat: 50, tactic: 88
};
let b = {
    name: "Arnold", shooting: 97, combat: 72, tactic: 68
};
let c = {
    name: "William", shooting: 87, combat: 86, tactic: 97
};
let soldiers = [a, b, c];
let values = {
    shooting: {
        name: [],
        score: 0
    },
    combat: {
        name: [],
        score: 0
    },
    tactic: {
        name: [],
        score: 0
    }
};

soldiers.map((item) => {
    ['shooting', 'combat', 'tactic'].forEach(name => {
        if (item[name] > values[name].score) {
            values[name].name = [item.name];
            values[name].score = item[name];
        } else if (item[name] === values[name].score) {
            values[name].name.push(item.name);
        }
    });
});

console.log(values);
0 голосов
/ 19 апреля 2019

Учитывая, что вы упомянули, что не все навыки одинаково важны, я бы рекомендовал взвешенную сумму в качестве совокупного показателя:

После demo реализует этот подход:

//src array
const soldiers = [
  {name: 'John', shooting: 95, combat: 50, tactic: 88},
  {name: 'Arnold', shooting: 97, combat: 72, tactic: 68},
  {name: 'William', shooting: 87, combat: 86, tactic: 97}
];
//cumulative score
const cumulative = soldier => {
  //weight for each skill
  const weights = {shooting: 1, combat: 1.5, tactic: 1.8};
  //extract skill properties into skills-object
  ({name, ...skills} = soldier);
  //iterate through skills and calculate weighted total
  return Object.entries(skills).reduce((score,item) => score += item[1]*weights[item[0]],0);
};
//best performer
const bestPerformer = soldiers.reduce((best, soldier) => cummulative(best) > cumulative(soldier) ? best : soldier, soldiers[0]);

console.log(bestPerformer);
0 голосов
/ 19 апреля 2019

Я сделал вам пример с комментариями. Дайте мне знать, если это подтолкнет вас в правильном направлении или вам нужна какая-либо другая помощь.

const soldiers = [{
    name: "John",
    shooting: 95,
    combat: 50,
    tactic: 88
  },
  {
    name: "Arnold",
    shooting: 97,
    combat: 72,
    tactic: 68
  },
  {
    name: "William",
    shooting: 87,
    combat: 86,
    tactic: 97
  }
];

const filteredSoldiers = soldiers
  .filter(soldier => soldier.combat > 60) // Find every soldier where combat is higher than 60
  .map(soldier => {
    return {
      name: soldier.name,
      average: (soldier.combat + soldier.tactic + soldier.shooting) / 3
    };
    // map will return an array with the filtered soldiers, and we put their average and their name in there
  })
  .sort((a, b) => b.average - a.average);
// Lastly we sort them high to low by their average score

console.log(
  filteredSoldiers.length > 0 ? filteredSoldiers[0].name : 'No soldiers with combat score higher thn 60'
);

jsfiddle

В условие фильтра вы, конечно, можете добавить больше проверок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...