如何使大量的 if 和 else if 语句更加简洁和紧凑 - Javascript [关闭]

问题描述 投票:0回答:4

完全编辑版本(更透明)

我目前正在尝试找到一种方法来使我一直在研究的这个代码更加紧凑。大陆集团一位名叫卡特森·马斯曼 (Cartsen Massmann) 的工程师说我可以使用答案中的这段代码

// sample data as received from a fetch call:
const data=[{Surname:"Massmann",Firstname:"Carsten",Initial:"CM",
 q1:8,q2:9,q3:7,q4:9,q5:10, // engineering
 q6:3,q7:6,q8:2,q9:4,q10:1, // medicine
 q11:2,q12:2,q13:1,q14:3,q15:4, // education
 q16:5,q17:3,q18:4,q19:2,q20:3, // agriculture 
 q21:7,q22:8,q23:9,q24:9,q25:8, // mathematics 
 q26:7,q27:7,q28:6,q29:9,q30:8  // science 
 }];

const sortedSubjects=(uObj,i=0)=>
 ["engineering","medicine","education","agriculture","mathematics","science"]
  .map(s=>[s,
   Array(5) // five questions per subject ...
  .fill(0)  // filling is necessary, as reduce will not loop over `undefined` values
  .reduce(a=>a+uObj[`q${++i}`],0)]) // sum up scores for each subject
  .sort(([,a],[,b])=>b-a); // sort according to descending scores

const scores=sortedSubjects(data[0]);
console.log("sorted scores:"+JSON.stringify(scores));
console.log(`The highest scoring subjects are ${scores.slice(0,2).map(([s])=>s).join(" and ")}.`);

但是我仍然不明白他发送的代码,我可以寻求一些帮助来尝试破译/理解他的代码,以便我可以将其应用于我的问题吗?预先感谢您。

javascript sorting var
4个回答
1
投票

考虑到外部链接代码我现在确信OP的问题是一个xy问题。问题的核心在于,许多用户有 30 个问题的测试分数,涉及 6 个学科领域。 OP 希望为某些已识别用户确定得分最高的两个主题领域。将用户识别和过滤部分放在一边,我想提供一个解决方案,用于查找给定用户得分最高和第二高的主题领域。

// sample data as received from a fetch call:
const data=[{Surname:"Massmann",Firstname:"Carsten",Initial:"CM",
 q1:8,q2:9,q3:7,q4:9,q5:10, // engineering
 q6:3,q7:6,q8:2,q9:4,q10:1, // medicine
 q11:2,q12:2,q13:1,q14:3,q15:4, // education
 q16:5,q17:3,q18:4,q19:2,q20:3, // agriculture 
 q21:7,q22:8,q23:9,q24:9,q25:8, // mathematics 
 q26:7,q27:7,q28:6,q29:9,q30:8  // science 
 }];

const sortedSubjects=(uObj,i=0)=>
 ["engineering","medicine","education","agriculture","mathematics","science"]
  .map(s=>[s,
   Array(5) // five questions per subject ...
  .fill(0)  // filling is necessary, as reduce will not loop over `undefined` values
  .reduce(a=>a+uObj[`q${++i}`],0)]) // sum up scores for each subject
  .sort(([,a],[,b])=>b-a); // sort according to descending scores

const scores=sortedSubjects(data[0]);
console.log("sorted scores:"+JSON.stringify(scores));
console.log(`The highest scoring subjects are ${scores.slice(0,2).map(([s])=>s).join(" and ")}.`);


1
投票

如果我正确理解你的问题,这是一个有趣的问题。但基本上,您可以通过将变量提升到一个对象中来做到这一点,如下所示:

var value1 = 4
var value2 = 3
var value3 = 5
var value4 = 1
var value5 = 2

const data = { value1, value2, value3, value4, value5 };

有了这个,他们现在就有名字了!所以你可以使用

Object
来帮助自己:

const values = Object.values(data).sort();
Object.keys(data).sort().map((k, idx) => {
    data[k] = values[idx]
});

这对值的值和对象的名称进行排序,然后将它们进行匹配。结果是:

{
  value1: 1,
  value2: 2,
  value3: 3,
  value4: 4,
  value5: 5
}

所以现在您可以调用

data.value1
来获取您在问题中指出的 value1 并获取已排序到其中的值。

这对我来说就像是一个 xy 问题。你实际上想做什么,因为对数组进行排序需要谷歌搜索,而不是这个网站的合适问题。


0
投票

您可以对变量进行排序,方法是将它们放入数组中,然后使用

.sort()
按值对数字进行排序。

let value1 = 4;
let value2 = 3;
let value3 = 5;
let value4 = 1;
let value5 = 2;
//Changed var to let (Better practice)

//Declaring an array. (Separate from value# vairable)
let values = [value1, value2, value3, value4, value5];

//Sorting right away so nothing is modified in future code.
values = values.sort();

//Logging results
console.log("Sorted values: " + values);

希望这有帮助。 :)

编辑:在数组上,我将值设置为其自己的值,但已排序。对于未来的代码实例,请勿修改原始变量。


0
投票

我想你想要这样的东西。

左侧的部分是将 value1... 变量重新分配给右侧排序后的结果。

var value1 = 4;
var value2 = 3;
var value3 = 5;
var value4 = 1;
var value5 = 2;

[value1, value2, value3, value4, value5] = [value1, value2, value3, value4, value5].sort();

console.log(value1, value2, value3, value4, value5);

© www.soinside.com 2019 - 2024. All rights reserved.