如何根据数组对象的某一个值进行去重

现在有这样对象数组,我只想根据姓名对数组进行去重

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        var arr = [
            {
                "id": "1",
                "name": "张三"
            },
            {
                "id": "2",
                "name": "张三"
            },
            {
                "id": "3",
                "name": "张三"
            },
            {
                "id": "4",
                "name": "李四"
            },
            {
                "id": "5",
                "name": "李四"
            },
            {
                "id": "6",
                "name": "王五"
            }
        ]

        /**
         * 根据对象的一个属性值对数组去重
         * @param arr  数组
         * @param attrName 属性名
         * @returns Array去重后的新数组
         */
        function unique(arr, attrName) {
            const res = new Map();
            return arr.filter((a) => !res.has(a[attrName]) && res.set(a[attrName], 1));
        }


        
        console.log(unique(arr, 'name'));
        
    </script>
</body>

</html>

 

 

Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现。如果你需要“键值对”的数据结构,Map比Object更合适。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

如果Map的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map将其视为一个键,包括0和-0。另外,虽然NaN不严格相等于自身,但Map将其视为同一个键。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        var arr = [
            {
                "id": "1",
                "name": "张三"
            },
            {
                "id": "2",
                "name": NaN
            },
            {
                "id": "3",
                "name": "张三"
            },
            {
                "id": "4",
                "name": NaN
            },
            {
                "id": "5",
                "name": "李四"
            },
            {
                "id": "6",
                "name": "王五"
            }
        ]

        /**
         * 根据对象的一个属性值对数组去重
         * @param arr  数组
         * @param attrName 属性名
         * @returns Array去重后的新数组
         */
        function unique(arr, attrName) {
            const res = new Map();
            return arr.filter((a) => !res.has(a[attrName]) && res.set(a[attrName], 1));
        }


        
        console.log(unique(arr, 'name'));
        
    </script>
</body>

</html>

 

 

 

总结:在开发过程中,涉及到数据结构,能使用Map 不使用Array 尤其是复杂的数据结构 ,如果对于数组的存储考虑唯一性 使用Set ,优先使用map 如果要求数据储存的唯一性使用Set 放弃使用Array。

posted @ 2020-11-27 21:52  小不点灬  阅读(2087)  评论(0编辑  收藏  举报