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是动态的,那么它会工作吗?此代码是破坏性的,因为它会改变输入列表中的项目。这对安格拉的烟斗不合适