【问题标题】:How can I compare values from multiple objects?如何比较多个对象的值?
【发布时间】:2019-04-23 12:54:06
【问题描述】:

我想比较我保存在数组中的对象的值。

我知道我可以使用来自每个对象的值创建新数组,但我正在尝试找到一些方法来做到这一点而不创建它们。

考虑我们有这样的情况:

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

所以我试图找到方法来比较多个属性并只返回一名士兵的姓名。

我会感激每一个提示。谢谢!

【问题讨论】:

标签: javascript arrays object comparison


【解决方案1】:

我用 cmets 给你做了一个例子。如果这将您推向正确的方向,或者您是否需要任何其他帮助,请告诉我。

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

在过滤条件中你当然可以添加更多的检查。

【讨论】:

  • 非常感谢!这正是我一直在寻找的——阅读上面提到的 find() 方法——我意识到我可以用 filter() 解决我的问题。我害怕将 filter() 用于带有对象的数组,但它对我来说非常有效。再次感谢您。
【解决方案2】:

您需要通过所有项目并选择最有价值的;

注意有些士兵可以有相似的值,这就是为什么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);

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 2023-01-30
    • 2010-09-27
    • 1970-01-01
    • 2020-02-18
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多