簡體   English   中英

在嵌套對象數組和另一個數組之間循環

[英]loop between a nested object array and another array

我有兩個數組,一個是普通數組,另一個是對象數組。 我想在這里告訴我如何在兩個人之間循環以達到“ Jhon ”的和(期中+期末)之和。在a中:第一個是學校,第二個是班級>>我將使用.split(“ |”)將它們放入數組中b:對象數組

我不需要整個代碼,只需要循環和if條件

該函數會將a中的1 | 1與school_no和class_no進行比較以進行匹配

但是我想根據條件將學生的姓名塗上顏色,例如紅色表示不好,藍色表示很好。

這里的數組

 a=["1|1|Jhon","1|2|Akram","1|3|Mali"] //first no for school no //second no for class no. b= [{ "result": [ { "midterm": 25, "evaluation": "good", "finalterm": 24 } ], "school _no": 1, "class_no": 1 }, { "result": [ { "midterm": 55, "evaluation": "verygood", "finalterm": 60 } ], "school_no": 1, "class_no": 2 }, { "result": [ { "midterm": 11, "evaluation": "bad", "finalterm": 12 } ], "school_no": 1, "class_no": 3 } ]; console.log(a); console.log(b); 

這不是家庭作業,但這只是我正在從事的更大工作的一個小例子。

只需簡單地對a (學生)的數據進行迭代,然后在b找到學校編號和班級編號(結果):

 a=["1|1|Jhon","1|2|Akram","1|3|Mali"] //first no for school no //second no for class no. b= [{ "result": [ { "midterm": 25, "evaluation": "good", "finalterm": 24 } ], "school_no": 1, "class_no": 1 }, { "result": [ { "midterm": 55, "evaluation": "verygood", "finalterm": 60 } ], "school_no": 1, "class_no": 2 }, { "result": [ { "midterm": 11, "evaluation": "bad", "finalterm": 12 } ], "school_no": 1, "class_no": 3 } ]; var result=[] a.forEach(function(element) { var data= element.split("|"); var found = b.find(function(element) { return element.school_no == data[0] && element.class_no== data[1]; }); result.push(data[2]+" is "+found.result[0].evaluation+" and sum of (midterm+finalterm) is :"+(found.result[0].midterm+found.result[0].finalterm)); document.getElementById(data[2]).className = found.result[0].evaluation; }); console.log(result); 
 .good { color: blue; } .bad { color: red; } .verygood { color: green; } 
 <div id="Jhon">Jhon</div> <div id="Akram">Akram</div> <div id="Mali">Mali</div> 

我了解的是您想生成一個新數組,該數組包含基於評估的對象列表,該對象列表包含字符串和您的顏色。

 var a=["1|1|Jhon","1|2|Akram","1|3|Mali"] //first no for school no //second no for class no. var b= [{ "result": [ { "midterm": 25, "evaluation": "good", "finalterm": 24 } ], "school_no": 1, "class_no": 1 }, { "result": [ { "midterm": 55, "evaluation": "verygood", "finalterm": 60 } ], "school_no": 1, "class_no": 2 }, { "result": [ { "midterm": 11, "evaluation": "bad", "finalterm": 12 } ], "school_no": 1, "class_no": 3 } ]; var resultArrNew = a.reduce(function(ac, val) { var valArra = val.split("|"); var matched = b.filter(function(obj) { return obj.school_no == valArra[0] && obj.class_no == valArra[1]; }); var text = valArra[2] + " is " + matched[0].result[0].evaluation + " and sum is " + (matched[0].result[0].midterm+matched[0].result[0].finalterm); var color = matched[0].result[0].evaluation === 'good' ? 'blue' : 'red'; ac.push({text: text, color: color}); return ac; }, []); console.log(resultArrNew); 

如果它們的順序相同,並且result[0]始終是與學生匹配的那個,則可以執行普通循環並按索引訪問:

 const students = [ "1|1|Jhon", "1|2|Akram","1|3|Mali" ]; const results = [{result:[{midterm:25,evaluation:"good",finalterm:24}],school_no:1,class_no:1},{result:[{midterm:55,evaluation:"verygood",finalterm:60}],school_no:1,class_no:2},{result:[{midterm:11,evaluation:"bad",finalterm:12}],school_no:1,class_no:3}]; for (let i = 0; i < students.length; i += 1) { const student = students[i]; const result = results[i]; console.log({ name: parseStudentName(student), result: getResultColor(result), }); } function parseStudentName(studentString) { return studentString.split("|")[2] }; function getResultColor(result) { switch(result.result[0].evaluation) { case "verygood": case "good": return "blue"; case "bad": return "red"; } } 

您在第二個數組上遇到錯誤=> school _no

我只是遍歷a數組。 我在每個學生項目中搜索b數組中的一個節點,並返回node.result數組。

 a=["1|1|Jhon","1|2|Akram","1|3|Mali"] //first no for school no //second no for class no. b= [{ "result": [ { "midterm": 25, "evaluation": "good", "finalterm": 24 } ], "school_no": 1, "class_no": 1 }, { "result": [ { "midterm": 55, "evaluation": "verygood", "finalterm": 60 } ], "school_no": 1, "class_no": 2 }, { "result": [ { "midterm": 11, "evaluation": "bad", "finalterm": 12 } ], "school_no": 1, "class_no": 3 } ]; for(var i = 0; i < a.length; i++) { var parts = a[i].split('|'); try { var node = getStudentNode(parseInt(parts[0]), parseInt(parts[1])); console.log(node); } catch(ex){ console.log(ex); } } function getStudentNode(sc, cl) { for(var i = 0; i < b.length; i++) { var node = b[i]; if(node.school_no !== sc || node.class_no !== cl) continue; return node.result; } } 

這是我將采用功能更強的方法的方法

 const a =["1|1|Jhon", "1|2|Akram", "1|3|Mali"] const b = [{ "result": [ { "midterm": 25, "evaluation": "good", "finalterm": 24 } ], "school _no": 1, "class_no": 1 }, { "result": [ { "midterm": 55, "evaluation": "verygood", "finalterm": 60 } ], "school_no": 1, "class_no": 2 }, { "result": [ { "midterm": 11, "evaluation": "bad", "finalterm": 12 } ], "school_no": 1, "class_no": 3 } ]; // import some functional helpers const { map, propPathOr, compose } = crocks const getStudent = record => { const [school_no, class_no, student_name] = record.split('|') return { school_no, class_no, student_name } } const getStudents = map(getStudent) const getEvaluation = propPathOr('', ['result', 0, 'evaluation']) const getEvaluations = map(getEvaluation) // assuming your lists are sorted const zip = (xs, ys) => xs.map((x, i) => [x, ys[i]]) const combineStudentAndEvaluation = ([student, evaluation]) => ({ ...student, evaluation }) const stringify = ({student_name, evaluation}) => `${student_name}: ${evaluation}` const studentEvaluationToString = compose(stringify, combineStudentAndEvaluation) const merged = zip(getStudents(a), getEvaluations(b)) .map(studentEvaluationToString) console.log(merged) 
 <script src="https://unpkg.com/crocks/dist/crocks.min.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM