Javascript 查找数组中的唯一元素,然后查找重复元素的字段(比如标记)之和
这个问题可能类似于,但我的问题是,它还有一些特点 我有以下表格的清单Javascript 查找数组中的唯一元素,然后查找重复元素的字段(比如标记)之和,javascript,arrays,typescript,angular5,lodash,Javascript,Arrays,Typescript,Angular5,Lodash,这个问题可能类似于,但我的问题是,它还有一些特点 我有以下表格的清单 let studentsList = [{ name:'A', rollNo:1, mark:10 }, { name:'B', rollNo:2, mark:30 }, { name:'C', rollNo:3, mark:40 },
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
}
]
目标是显示学生列表中的唯一名称和标记
,并像这样从中查找唯一名称
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>
-
{{student.name}
编辑
学生列表是动态的,我们可以根据需要添加更多详细信息。您可以在管道中使用此功能:
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}];
常量响应=学生列表减少((acc,ele)=>{
const existingStudent=acc.find(x=>x.name==ele.name);
如果(!现有学生)返回acc.concat(ele);
返回(existingStudent.mark+=ele.mark,acc);
},[])
控制台日志(resp)代码>您可以在管道中使用此功能:
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}];
常量响应=学生列表减少((acc,ele)=>{
const existingStudent=acc.find(x=>x.name==ele.name);
如果(!现有学生)返回acc.concat(ele);
返回(existingStudent.mark+=ele.mark,acc);
},[])
控制台日志(resp)代码>一个如何累积值的示例
让学生登录=[
{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学生){
if(学生名中的student.name){
byName[student.name].mark+=student.mark;
}否则{
byName[student.name]={…student};
}
}
log(Object.values(byName))代码>一个如何累积值的示例
让学生登录=[
{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学生){
if(学生名中的student.name){
byName[student.name].mark+=student.mark;
}否则{
byName[student.name]={…student};
}
}
log(Object.values(byName))代码>如果您需要一个名称和标记的结果数组(重复项的总和),那么您可以在lodash中使用一种非常干净的方法(因为您标记了lodash)。将始终按其唯一参数对其进行分组,并在每个组的数组中使用该参数对所有重复项进行分组
首先,使用名称将其分组
然后映射()每个组,并通过
以下是一个工作示例:
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=389;(输入)
.groupBy('名称')
.map((g,name)=>({name,mark:u.sumBy(g,'mark')}))
.value();
控制台日志(res)代码>
如果您需要一个名称和标记的结果数组(重复项的总和),那么您可以在lodash中使用一种非常干净的方法来实现这一点(因为您标记了lodash)。将始终按其唯一参数对其进行分组,并在每个组的数组中使用该参数对所有重复项进行分组
首先,使用名称将其分组
然后映射()每个组,并通过
以下是一个工作示例:
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=389;(输入)
.groupBy('名称')
.map((g,name)=>({name,mark:u.sumBy(g,'mark')}))
.value();
控制台日志(res)代码>
您可以根据卷号对学生数组进行分组,并在对象累加器中添加相同卷号的标记。使用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]|{名称,rollNo,总计:0};
r[rollNo]。总计+=标记;
返回r;
},{}));
console.log(uniqueStudents)代码>您可以根据卷号对学生数组进行分组,并在对象累加器中添加相同卷号的标记。使用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]|{名称,rollNo,总计:0};
r[rollNo]。总计+=标记;
返回r;
},{}));
console.log(uniqueStudents)代码>谢谢你的回答。如果studentList是动态的,那么它会工作吗?此代码是破坏性的,因为它会改变输入列表中的项目。这不适用于有角度的管道。因此,最好在加载和存储数据的地方使用它。这意味着不需要写入管道?@AnandRaj“意味着不需要写入管道?”这意味着,当您在控制器中加载数据后立即执行此操作,并使用累积值存储数组时,那么在呈现数据时就不需要这样的管道了。谢谢你的回答。如果studentList是动态的,那么它会工作吗?此代码是破坏性的,因为它会改变输入列表中的项目。这对安格拉的烟斗不合适