在下面的代码中,我尝试计算每个主题的总分数并将它们存储在标记对象中。我正在检查 edu 中的每个 obj 是否是基于主题名称(名称)和主题级别(级别)的信息的一部分。如果匹配,我会将所有内容放入数组中。
在这里,每次将主题添加到信息时,在函数“func”中,我都必须添加另一个“else if”来检查。我不想总是添加这个条件检查。
我想让它变得通用,比如说,我的信息变成:
let info = {"math": 1, "science": 2}
or
let info = {"math": 1, "science": 2, "history": 1, arts: 1}
我不想删除或添加条件检查。我希望在不依赖的情况下完成响应(edu)和信息之间的检查。仅根据信息进行检查。
这是在节点js中。我该怎么做?我虽然想到了 switch,但这和“if else”是一样的。
let res = {
edu: [
{
name: "math",
level: 1,
marks: 50,
part: 1,
},
{
name: "math",
level: 1,
marks: 57,
part: 2,
},
{
name: "science",
level: 2,
marks: 70,
part: 1,
},
],
age: 20,
name: "abc",
}
let info = { math: 1, science: 2, history: 1 }
const func = () => {
var marks = {}
let subject = Object.keys(info)
subject.forEach((subjName, index) => {
marks[subjName] = 0
})
console.log("marks = ", marks)
var consolidatedInfo = []
res.edu.forEach(function (subj) {
if (subj.name === Object.keys(info)[0] && subj.level === info[Object.keys(info)[0]]) {
marks[subj.name] += subj.marks
const eachSubjPartInfo = {
name: subj.name,
level: subj.level,
marks: subj.marks,
part: subj.part,
}
consolidatedInfo.push(eachSubjPartInfo)
console.log("marks: ", marks)
} else if (subj.name === Object.keys(info)[1] && subj.level === info[Object.keys(info)[1]]) {
marks[subj.name] += subj.marks
const eachSubjPartInfo = {
name: subj.name,
level: subj.level,
marks: subj.marks,
part: subj.part,
}
consolidatedInfo.push(eachSubjPartInfo)
console.log("marks: ", marks)
} else if (subj.name === Object.keys(info)[2] && subj.level === info[Object.keys(info)[2]]) {
marks[subj.name] += subj.marks
const eachSubjPartInfo = {
name: subj.name,
level: subj.level,
marks: subj.marks,
part: subj.part,
}
consolidatedInfo.push(eachSubjPartInfo)
console.log("marks: ", marks)
}
})
console.log("consolidatedInfo = ", consolidatedInfo)
console.log("marks = ", marks)
}
func()
你可以在每次迭代中使用逻辑
info[name] === level
来动态检查并且只在满足时添加。无需转换为数组然后检查
我使用数组
reduce
。为了创建每个主题的初始对象,我使用了 0 分Object.fromEntries(Object.keys(info).map(k => [k,0]))
let res = { "edu": [ { "name": "math", "level": 1, "marks": 50,"part": 1 },{"name": "math", "level": 1, "marks": 57,"part": 2},{"name": "science", "level": 2, "marks": 70,"part": 1}, ], "age": 20, "name": "abc"}
let info = {"math": 1, "science": 2, "history": 1}
const marksAccumulator = Object.fromEntries(Object.keys(info).map(k => [k,0]))
const result = res.edu.reduce((acc,{name,level,marks,part}) => {
if(info?.[name] === level){
acc.marksAccumulator[name] += marks
acc.consolidated.push({name,level,marks,part})
}
return acc
},{marksAccumulator,consolidated:[]})
console.log(result)
从
result
您可以获得所需的数据,如result.consolidated
等