在数组中查找唯一元素并查找重复元素的字段总和(例如标记)
Find unique element in an array and the find the sum of field(say Marks) for the duplicate elements
这个问题可能与 类似,但我的问题有更多的特点。
我有如下表格的列表
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
}
]
objective是从studentList
中显示唯一名称和标记,并从中找到唯一名称。
A 10
B 30
C 40
此外,如果名称重复,则添加标记并显示。
A 60
B 30
C 40
我可以像这样过滤唯一名称
import { Pipe, PipeTransform } from '@angular/core';
import * as _ from 'lodash';
@Pipe({
name: 'unique',
pure: false
})
export class UniquePipe implements PipeTransform {
transform(value: any): any{
if(value!== undefined && value!== null){
return _.uniqBy(value, 'name');
}
return value;
}
}
然后在 html
<ul>
<li *ngFor="let student of studentList| unique">
{{student .name}}
</li>
</ul>
编辑
studentsList
是动态的,我们可以添加所需的详细信息。
你可以在你的管道中使用这个函数:
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)。 _.groupBy 将始终按其唯一参数对其进行分组,并将所有重复项与该参数分组在每个组的数组中。
这是一个工作示例:
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>
您可以根据卷号对学生数组进行分组,并在对象累加器中添加相同卷号的标记。使用 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);
这个问题可能与
我有如下表格的列表
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
}
]
objective是从studentList
中显示唯一名称和标记,并从中找到唯一名称。
A 10
B 30
C 40
此外,如果名称重复,则添加标记并显示。
A 60
B 30
C 40
我可以像这样过滤唯一名称
import { Pipe, PipeTransform } from '@angular/core';
import * as _ from 'lodash';
@Pipe({
name: 'unique',
pure: false
})
export class UniquePipe implements PipeTransform {
transform(value: any): any{
if(value!== undefined && value!== null){
return _.uniqBy(value, 'name');
}
return value;
}
}
然后在 html
<ul>
<li *ngFor="let student of studentList| unique">
{{student .name}}
</li>
</ul>
编辑
studentsList
是动态的,我们可以添加所需的详细信息。
你可以在你的管道中使用这个函数:
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)。 _.groupBy 将始终按其唯一参数对其进行分组,并将所有重复项与该参数分组在每个组的数组中。
这是一个工作示例:
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>
您可以根据卷号对学生数组进行分组,并在对象累加器中添加相同卷号的标记。使用 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);