JS数组中 reduce() 方法 数组对象去重

JavaScript reduce() 方法

此篇主要介绍reduce()方法去重的使用

定义和用法

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

reduce() 可以作为一个高阶函数,用于函数的 compose。

注意: reduce() 对于空数组是不会执行回调函数的。

浏览器支持

表格中的数字表示支持该方法的第一个浏览器版本号。

在这里插入图片描述

语法
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
参数
参数描述
function(total,currentValue, index,arr)必需。用于执行每个数组元素的函数。
initialValue可选。传递给函数的初始值

回调函数参数:

参数描述
total必需。初始值, 或者计算结束后的返回值。
currentValue必需。当前元素
currentIndex可选。当前元素的索引
arr可选。当前元素所属的数组对象。
简单示例

初始数据

var arr = [
  {id: 1, name: 'test1'},
  {id: 2, name: 'test2'},
  {id: 3, name: 'test3'},
  {id: 1, name: '张三1'},
  {id: 2, name: '张三2'},
  {id: 3, name: '张三3'}
];
1. reduce()方法去重
let newobj = {}; 
arr = arr.reduce((total, currentValue) => {
	newobj[currentValue.id] ? '' : newobj[currentValue.id] = total.push(currentValue); 
	return total
}, [])

此方法为遍历 arr ,查看是否有 id 属性值相同的一项,没有则将当前项 currentValue 加入数组 arr ,然后返回修改后数组,作为下一次的初始值进行遍历

2. 原生js方法
// 方法一
function distinct1(arr,key){
    var newobj = {},newArr = [];
    for(var i=0;i<arr.length;i++){
        var item = arr[i];
    	if(!newobj[item[key]]){
            newobj[item[key]] = newArr.push(item);
    	}
    }
    return newArr;
}
// 方法二
function distinct2(arr,key){
    var newArr = [];
    for(var i=0;i<arr.length;i++){
      var flag = true;
      for(var j=0;j<newArr.length;j++){
        if(arr[i].id == newArr[j].id){
          flag = false;
               break
        };
      }; 
      if(flag){
        newArr.push(arr[i]);
      };
    };
    return newArr;
}
 
// 方法三, 方法三会更改数组的原始数据
function distinct3(arr, key){
    for(let i = 0; i < arr.length; i++) {
        for(let j = i+1; j < arr.length; j++) {
            if(arr[i][key] === arr[j][key]){
                arr.splice(j, 1);
                j = j-1;
            }
        }
    }
    return arr;
}
 

js原生方法有很多,这里只提供几个网上的模板参考

·

副内容

这里提供几个不成熟的方式,对数组对象类型数据进行处理

var content = [
{userId: '1', name: '张三', organizationId: '11'},
{userId: '2', name: '李四', organizationId: '12'},
{userId: '3', name: '王五', organizationId: '13'},
]

var allPersonList = [
{userId: '1', age: '18'},
{userId: '2', age: '19'},
{userId: '3', age: '20'},
]

var organizationAddress = [
{id: '11', city: '上海'},
{id: '12', city: '重庆'},
{id: '13', city: '北京'},
]
	let list = content && content.map(
      (item: { userId: any }, index: number) => {
        let arr = allPersonList[0] && allPersonList.map((person: any) => {
          if (person.id === item.userId) {
          	// 将需要的数据合到一起
            return item = { ...person, ...item }
          }
        })
        // 使用 filter() 过滤掉 undefined 项
        arr = arr.filter(person => person)
        // console.log(arr,'arr');
        // 打印发现每组数据都一样,取其中一组
        return { ...arr[0], num: index + 1 }
      }
    )

    list = list && list.map((item: any) => {
      let address = organizationAddress[0] && organizationAddress.map((organization: any) => {
        if (item.organizationId === organization.id) {
          // 将需要的数据合到一起
          return item = { ...item, city: organization.city }
        }
      })
      address = address.filter(organization => organization)
      // console.log(address,'address');
      return { ...address[0] }
    })
     console.log(list, 'list');

最后合成得到的数据

list = [
{userId: '1', name: '张三', organizationId: '11', age: '18', city: '上海'},
{userId: '2', name: '李四', organizationId: '12', age: '19', city: '重庆'},
{userId: '3', name: '王五', organizationId: '13', age: '20', city: '北京'},
]

参考引用:

数组里面对象去重的3种方法: https://blog.csdn.net/l284969634/article/details/91397332

js数组去重的多种方法: https://blog.csdn.net/linglingzi001/article/details/107772411

JS中reduce方法: https://blog.csdn.net/hope93/article/details/86528183

Array.reduce()方法解析: https://blog.csdn.net/SEAYEHIN/article/details/89520575

JavaScript reduce() 方法: https://www.runoob.com/jsref/jsref-reduce.html

JavaScript数组去重—ES6的两种方式: https://blog.csdn.net/FE_dev/article/details/78110153

JavaScript 实现 reduce() 方法函数: https://blog.csdn.net/Beijiyang999/article/details/80186242

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值