Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.0k views
in Technique[技术] by (71.8m points)

一个数组里面包含多个对象,对象有两个属性 怎么在重复属性里保留另一个属性值最高的

有一个对象数组有如下有两个属性:
重复的名字里只保留一个分数最高的

let obj = [
{名字: 小明, 分数: 100},
{名字: 小明, 分数: 98},
{名字: 小红, 分数:100},
{名字: 小白, 分数: 100},
{名字: 小红, 分数:95},
]

let obj = [
{名字: 小明, 分数: 100},
{名字: 小红, 分数:100},
{名字: 小白, 分数: 100},
]


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

就很好奇,js 话题下总有层出不穷的数组/JSON 遍历/查找/转化的问题。

问题模板里不是有几个项么?自己做过什么尝试?都给提问者删了。

好的问题是要问到根本上,让人一眼看出你疑惑的点是什么。同样的,好的回答是要能授人以渔,而不是甩一段能解决这个问题的代码不管你是否理解就完事。

这次的 obj 可能长这样,下次的可能是另外的样子;这次的需求是保留一个分数最高的,下次可能是用数组保存这个人的所有分数, 又或者是统计相同名字分数一共是多少。需求场景天天变,有扎实的基本功才能以不变应万变。

回到问题,你如果稍微懂一点 SQL,应该知道这个就类似于 group by 加 max。JS 数组没有 groupBy 方法,我们可以自己实现一个,然后做一下 max 就ok了。

// 这个 groupBy 函数是通用的
function groupBy(arr, by) {
    return arr.reduce((groups, item) => {
        // 获取 item 的分组的 key
        const key = by(item);
        // 看看这个组是不是已经存在
        let group = groups.find(g => g.key === key);
        if(!group) {
            // 不存在就创建一个新组
            group = {key, items: []};
            groups.push(group);
        }
        // item 放入组中
        group.items.push(item);
        return groups;
    }, []);
}

let arr =  [
    {'名字': '小明', '分数': 100},
    {'名字': '小明', '分数': 98},
    {'名字': '小红', '分数': 100},
    {'名字': '小白', '分数': 100},
    {'名字': '小红', '分数': 95},
];

// 先按名字分组
groupBy(arr, item => item['名字'])
    .map(group => {
        // 然后每个组就是你要的一条新的记录
        // 分数为组内所有项的分数最大
        return {
            '名字': group.key,
            '分数': Math.max(...group.items.map(item => item['分数']))
        }
    });


// 按名字分组然后统计总分
groupBy(arr, item => item['名字'])
    .map(group =>({ 
        '名字': group.key,
        '总分': group.items.reduce((sum, item) => sum + item['分数'], 0)
    }))

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...