简单分享一个算法

157 阅读3分钟

4月日新计划更文活动 第11天

什么是规约算法

规约算法是一种计算数学表达式或公式结果的算法,它通过递归及化简所给的表达式,将其化为最简形式,并通过特定的规则计算出结果。规约算法被广泛用于计算机代数系统、数学软件以及计算机科学领域中的编译器、解释器等软件中。常见的规约算法包括逆波兰表达式、抽象语法树等。

规约算法确实可以指代很多不同的算法,规约算法通常是指能够将一个表达式或公式通过某些规则化简或转化为最简形式的算法。这些算法包括逆波兰表达式、抽象语法树、多项式约减算法、高斯消元法等

问题

现在后端返回给我一个数据结构

data = [
	{
		date: 20230405,
		name: '小黄'
	},{
		date: 20230406,
		name: '小红'
	},{
		date: 20230406,
		name: '小蓝'
	},{
		date: 20230408,
		name: '小绿'
	},{
		date: 20230408,
		name: '小紫'
	},
]

而我需要讲这个数据用作展示,现在展示要求按照板块进行展示,区分板块的条件就是 date 时间,相同的时间应该作为同一个板块的数据,简单来说就是转化为:

data2 = [
	{
		date: 20230405,
		list: [{
			date: 20230405,
			name: '小黄'
		}]
	},{
		date: 20230406,
		list: [{
			date: 20230406,
			name: '小红'
		},{
			date: 20230406,
			name: '小蓝'
		}]
	},{
		date: 20230408,
		list: [{
			date: 20230408,
			name: '小绿'
		},{
			date: 20230408,
			name: '小紫'
		}]
	}
]

这样转化以后,我们就可以在页面展示为

image.png

最经典的需要展示为这样的,就是账单页面,后端返回给你一连串的账单数据,你需要根据时间来做一个分组,每一个板块只包含当天的数据

然后根据这个需求,我们来编写 billDataTransform 函数,传入一个正常数组,返回后面的新数据格式

function billDataTransform(data) { 
	return data.reduce((acc, cur) => {
		const date = cur.date; 
		const item = { date, name: cur.name }; 
		const group = acc.find((group) => group.date === date); 
		if (group) { 
			group.list.push(item); 
		} else { 
			acc.push({ date, list: [item]}); 
		} 
		return acc; 
	}, []); 
}
  • reduce()方法是JavaScript数组的一种原型方法,将每个项传递给给定的回调函数,reduce()方法的输出值是回调函数的累积器参数(也称为累加器)。
  • acc参数是reduce()函数的累积器。每次迭代,它都是上一次迭代的结果。
  • cur参数是累积器中下一个数组项。
  • []是reduce()函数的初始值。第一次回调调用时将使用它,以便可以声明累加器的默认初始值。为空数组时,初始化值为一个空数组。 累积器每次迭代,新的数据项都将根据其日期与其他项进行分组。如果存在一组具有已知日期的现有项,则新的数据项将添加到该组中。否则,将创建一个新的组,将该日期加入到该组中。

这个函数通过将具有相同日期的数据项分组,使数据更加可读性高,并且使操作它们更加容易。 对于数据处理来说,这是一个非常实用的技巧,特别是在需要将一些数据组合在一起的情况下。