【问题标题】:How to get Top 5 and Lowest 5 values in an object of objects in JavaScript?如何在 JavaScript 中的对象对象中获取 Top 5 和 Lowest 5 值?
【发布时间】:2019-07-01 00:18:20
【问题描述】:

给定一个看起来像这样的对象:

let abilities =  {
      "technical": {
        "Corners": 12,
        "Crossing": 12,
        "Dribbling": 20,
        "Finishing": 14,
        "First Touch": 17,
        "Free Kick": 13,
        "Heading": 7,
        "Long Shots": 11,
        "Long Throws": 5,
        "Marking": 3,
        "Passing": 15,
        "Penalty Taking": 19,
        "Tackling": 4,
        "Technique": 18
      },
      "mental": {
        "Aggression": 8,
        "Anticipation": 12,
        "Bravery": 17,
        "Composure": 15,
        "Concentration": 13,
        "Decisions": 16,
        "Determination": 15,
        "Flair": 18,
        "Leadership": 6,
        "Off The Ball": 14,
        "Positioning": 7,
        "Teamwork": 9,
        "Vision": 16,
        "Work Rate": 12
      },
      "physical": {
        "Acceleration": 17,
        "Agility": 20,
        "Balance": 16,
        "Jumping Reach": 8,
        "Natural Fitness": 16,
        "Pace": 16,
        "Stamina": 17,
        "Strength": 11
      }
    }

我想获取5个最高值和5个最低值的键和值。

我首先尝试通过执行以下操作来获取 abilities 对象内每个对象中的最高整数值:

Object.keys(abilities).forEach(key => {
  let value = abilities[key];
  console.log(key)
  console.log(value)
  let maxval = Object.keys(abilities).reduce((a, b) => abilities[a] > abilities[b] ? a : b);
  console.log(maxval)
});

这会打印出内部对象的名称和整个子对象本身。

> technical
> {Corners: 12, Crossing: 12, Dribbling: 20, Finishing: 14, First Touch: 17, ...}

但是,maxval 没有提供任何与 Max 相关的信息。

我该如何解决我的任务?

【问题讨论】:

  • 预期的输出到底是什么,你想要一个数组或对象还是每个外部键的最小值和最大值(如technicalmental)?
  • 鉴于这样的对象,我期待类似:top = {"Dribbling": 20, "Agility": 20, "Penalty Taking": 19, "Technique": 18, "Flair": 18} 和 'low = {"Marking": 3, "Tackling": 4, "Long Throws": 5, "Leadership" : 6, "Heading": 7}` 分成两个函数也可以。它是所有对象中排名前 5 位和最低 5 位的能力。

标签: javascript arrays object ecmascript-6


【解决方案1】:

如果只想要五个最高值和五个最低值,则按降序提取值和sort,提取最高和最低五个值。

let abilities = {"technical":{"Corners":12,"Crossing":12,"Dribbling":20,"Finishing":14,"First Touch":17,"Free Kick":13,"Heading":7,"Long Shots":11,"Long Throws":5,"Marking":3,"Passing":15,"Penalty Taking":19,"Tackling":4,"Technique":18},"mental":{"Aggression":8,"Anticipation":12,"Bravery":17,"Composure":15,"Concentration":13,"Decisions":16,"Determination":15,"Flair":18,"Leadership":6,"Off The Ball":14,"Positioning":7,"Teamwork":9,"Vision":16,"Work Rate":12},"physical":{"Acceleration":17,"Agility":20,"Balance":16,"Jumping Reach":8,"Natural Fitness":16,"Pace":16,"Stamina":17,"Strength":11}};

const sortedValues = Object.values(abilities).flatMap(Object.entries).sort(([, a], [, b]) => b - a);

const fiveHighest = sortedValues.slice(0, 5);
const fiveLowest = sortedValues.slice(-5);

console.log(fiveHighest);
console.log(fiveLowest);
.as-console-wrapper { max-height: 100% !important; top: auto; }

你也可以使用reduce将二维数组变成对象:

let abilities = {"technical":{"Corners":12,"Crossing":12,"Dribbling":20,"Finishing":14,"First Touch":17,"Free Kick":13,"Heading":7,"Long Shots":11,"Long Throws":5,"Marking":3,"Passing":15,"Penalty Taking":19,"Tackling":4,"Technique":18},"mental":{"Aggression":8,"Anticipation":12,"Bravery":17,"Composure":15,"Concentration":13,"Decisions":16,"Determination":15,"Flair":18,"Leadership":6,"Off The Ball":14,"Positioning":7,"Teamwork":9,"Vision":16,"Work Rate":12},"physical":{"Acceleration":17,"Agility":20,"Balance":16,"Jumping Reach":8,"Natural Fitness":16,"Pace":16,"Stamina":17,"Strength":11}};

const sortedValues = Object.values(abilities).flatMap(Object.entries).sort(([, a], [, b]) => b - a);

const fiveHighest = sortedValues.slice(0, 5).reduce((a, [k, v]) => ({ ...a, [k]: v }), {});
const fiveLowest = sortedValues.slice(-5).reduce((a, [k, v]) => ({ ...a, [k]: v }), {});

console.log(fiveHighest);
console.log(fiveLowest);
.as-console-wrapper { max-height: 100% !important; top: auto; }

【讨论】:

  • 还有没有办法用数字获取key的名字?
  • 当然@Dawn17 - 一秒钟。
  • 这就是你想要的@Dawn17?
  • 是的,太好了!非常感谢。
  • 没问题@Dawn17,总是乐于提供帮助。
猜你喜欢
  • 2018-09-12
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多