这个问题可能类似于In Angular2 * ngFor迭代,如何只输出数组中的唯一值?但我的问题是有更多的功能。
我有以下表格的清单
…
您可以将学生数组分组到卷号上,并在对象累加器中添加相同卷号的标记。运用 array#values() 获取与卷号对应的所有值。
array#values()
let studentsList = [{ name:'A', rollNo:1, mark:10 }, { name:'B', rollNo:2, mark:30 }, { name:'C', rollNo:3, mark:40 }, { name:'A', rollNo:1, mark:50 } ], uniqueStudents = Object.values(studentsList.reduce((r,{name, rollNo, mark}) => { r[rollNo] = r[rollNo] || {name, rollNo, total : 0}; r[rollNo].total += mark; return r; },{})); console.log(uniqueStudents);
您可以将此功能用于管道:
value.reduce((acc, ele) => { const existingStudent = acc.find(x => x.name === ele.name); if(!existingStudent) return acc.concat(ele); return (existingStudent.mark += ele.mark, acc); },[])
测试它:
var studentsList=[{name:"A",rollNo:1,mark:10},{name:"B",rollNo:2,mark:30},{name:"C",rollNo:3,mark:40},{name:"A",rollNo:1,mark:50}]; const resp = studentsList.reduce((acc, ele) => { const existingStudent = acc.find(x => x.name === ele.name); if(!existingStudent) return acc.concat(ele); return (existingStudent.mark += ele.mark, acc); },[]) console.log(resp);
如何累积值的示例。
let studentsList = [ { name: 'A', rollNo: 1, mark: 10 }, { name: 'B', rollNo: 2, mark: 30 }, { name: 'C', rollNo: 3, mark: 40 }, { name: 'A', rollNo: 1, mark: 50 } ]; const byName = {}; for (var student of studentsList) { if (student.name in byName) { byName[student.name].mark += student.mark; } else { byName[student.name] = { ...student }; } } console.log(Object.values(byName));
如果你需要一个名称和标记的结果数组(重复的总和),那么你可以在lodash中使用一种非常简洁的方式(因为你标记了lodash)。 _。通过...分组 将始终按其唯一参数对其进行分组,并将所有重复项与该参数组合在一个数组中。
name
这是一个工作示例:
let input = [{"name":"A","rollNo":1,"mark":10},{"name":"B","rollNo":2,"mark":30},{"name":"C","rollNo":3,"mark":40},{"name":"A","rollNo":1,"mark":50}], res = _(input) .groupBy('name') .map((g, name) => ({name, mark: _.sumBy(g, 'mark')})) .value(); console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>