Daw*_*n17 1 javascript arrays object ecmascript-6
给定一个看起来像这样的对象:
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
}
}
Run Code Online (Sandbox Code Playgroud)
我想获得 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)
});
Run Code Online (Sandbox Code Playgroud)
这将打印出内部对象的名称和整个子对象本身。
> technical
> {Corners: 12, Crossing: 12, Dribbling: 20, Finishing: 14, First Touch: 17, ...}
Run Code Online (Sandbox Code Playgroud)
但是,maxval没有提供与 Max 相关的任何内容。
我该如何解决我的任务?
如果您只需要五个最高值和五个最低值,请提取值并按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);Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: auto; }Run Code Online (Sandbox Code Playgroud)
您还可以使用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);Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: auto; }Run Code Online (Sandbox Code Playgroud)