对数组的去重,三级联动的列选择器

使用uniapp框架,uview组件  如果你使用的也是。直接新建页面。看我展示效果即可。

不知道大佬是怎么去重的。我只能展示自己的写法。研究了几个小时。呜呜呜呜。请大佬指教

<template>
	<view class="content">
		<u-select v-model="show" :list="list" @confirm="confirm"></u-select>
		<view class="contHei" @click="dianji(0)">
			{{contHei1}}
		</view>
		<view class="contHei" @click="dianji(1)">
			{{contHei2}}
		</view>
		<view class="contHei" @click="dianji(2)">
			{{contHei3}}
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				// 按钮的展示数据  
				contHei1: "全部",
				contHei2: "全部",
				contHei3: "全部",
				// 列选择器的展示数据
				maoPage: [],
				tiwaiPage: [],
				tiaozaoPage: [],
				// 是否显示列选择器
				show: false,
				// 当前点击的是第几级按钮
				Ydianji: 0,
				// 列选择器的渲染数据  统一.用的是一个列选择器
				list: [{
						value: '1',
						label: '江'
					},
					{
						value: '2',
						label: '湖'
					}
				],
				// 模拟数据
				heihei: '[{"children":[{"children":[{"dataId":"11","className":"蛔虫"},{"dataId":"13","className":"绦虫"},{"dataId":"10","className":"钩虫"},{"dataId":"8","className":"鞭虫"},{"dataId":"14","className":"心丝虫"}],"className":"体内寄生虫"},{"children":[{"dataId":"15","className":"跳蚤"},{"dataId":"16","className":"蜱虫"},{"dataId":"19","className":"虱子"},{"dataId":"17","className":"耳螨"},{"dataId":"18","className":"疥螨"},{"dataId":"20","className":"蠕形螨"}],"className":"体外寄生虫1"}],"className":"犬","classImg":null},{"children":[{"children":[{"dataId":"21","className":"蛔虫"},{"dataId":"22","className":"绦虫"},{"dataId":"23","className":"钩虫"},{"dataId":"24","className":"心丝虫"}],"className":"体内寄生虫"},{"children":[{"dataId":"26","className":"跳蚤"},{"dataId":"27","className":"蜱虫"},{"dataId":"29","className":"耳螨"},{"dataId":"30","className":"蠕形螨"},{"dataId":"25","className":"背肛螨"},{"dataId":"31","className":"戈托伊蠕形螨"},{"dataId":"32","className":"虱子"}],"className":"体外寄生虫"}],"className":"猫","classImg":null},{"children":[{"children":[{"dataId":"34","className":"绦虫"},{"dataId":"33","className":"球虫"},{"dataId":"35","className":"线虫"}],"className":"体内寄生虫"},{"children":[{"dataId":"36","className":"跳蚤"},{"dataId":"37","className":"蜱虫"},{"dataId":"39","className":"螨虫"},{"dataId":"38","className":"虱子"}],"className":"体外寄生虫"}],"className":"其他","classImg":null}]'
			}
		},
		onLoad() {
			this.heihei = JSON.parse(this.heihei);
			/ 初始化
			/ 初始化
			/ 初始化
			/ 初始化
			/ 初始化
			// 列选择器三级联动
			this.chushihua();
		},
		methods: {
			chushihua() {
				var then = this;
				//这三个数组是为了给组件展示数据的 根据筛选条件展示不同数据。我是用push给数组的。所以进来先清空省得堆积数据
				then.maoPage = [];
				then.tiwaiPage = [];
				then.tiaozaoPage = [];
				var result = JSON.parse(JSON.stringify(this.heihei));
				// 存放二级
				var data = [];
				// 存放三级
				var card = [];
				//、、、、、、、、、、、、、、、、
				var pppp = {
					"className": '全部'
				}
				// 因为模拟数据里面没有 全部 我公司需要展示全部,所以在整个数据里面新增一个对象 放在最上层
				result.unshift(pppp);
				result.forEach((item, index) => {
					// 因为第一个对象是自己添加的对象,没有二级数据,所以略过第一
					if (index != 0) {
						// 判断第一个列是否跟数组里面的数据相同
						if (then.contHei1 == item.className) {
							item.children.forEach(itttt => {
								// 相同 就把里面的二级拿出来
								data.push(itttt.className);
								// 用户初次进入没有选中.默认给第一个 二级按钮展示文字
								if (!then.contHei2) {
									then.contHei2 = '全部';
								}
								itttt.children.forEach(itii => {
									// 判断二级按钮文字是否跟查找的数据是否相同
									if (then.contHei2 == itttt.className) {
										// 拿到三级列选择器数据
										card.push(itii.className)
									}else{
										// 判断 二级按钮文字是否是全部  是 就拿所有的  
										if(then.contHei2=='全部'){
											card.push(itii.className)
										}
									}
								})
							})
						} else {
							// 如果不相同,还要判断下第一个列 是否是全部,如果是在去push第二层跟第三层数据,避免拿错了第二层跟第三层数据

							if (then.contHei1 == '全部') {
								// 一级按钮是全部的情况下,拿所有的二级数据 
								item.children.forEach(itttt => {
									// 把所有的第二层全部push进一个空数组,稍后进行去重
									data.push(itttt.className);
									// 用户初次进入没有选中.默认给第一个  二级按钮展示文字
									if (!then.contHei2) {
										then.contHei2 = '全部';
									}
									// 此时一级按钮是全部查找 判断二级按钮是不是全部  不是就拿对应的三级
									// 判断二级按钮是否跟数组里面的二级相同 相同就拿对应的三级
									if(then.contHei2 == itttt.className){
										itttt.children.forEach(itii => {
											// 获取对应的三级数据  稍后进行去重
											card.push(itii.className)
										})
									}else{
										// 如果不相同.判断二级按钮是不是全部 如果不是就判断二级是否是全部  避免三级列展示数据重复
										if(then.contHei2=='全部'){
											// 此时走到这一步就说明 一级按钮 二级按钮都是全部  我们就获取所有的三级数据.稍后进行去重
											itttt.children.forEach(itii => {
												card.push(itii.className)
											})
										}
										
									}
									
								})
							}
						}
					}

					//注意!!!!  此时还没有一级列选择器展示的数据。我们需要定义好列选择器所需要的键 放置数据 最后push进列选择器载体 
					//!!!!!!一级选择器不需要去重
					var data2 = {
						"label": item.className,
						"value": index,
					}
					then.maoPage.push(data2);
				})
				// 用户初次进入没有选中.默认给第一个  一级  一级不需要去重
				if (!then.contHei1) {
					then.contHei1 = then.maoPage[0].label;
				}
				// 二级数据去重
				data = ([...new Set(data)]);
				//二级数据本身没有全部这个字段 在顶部添加一个全部
				data.unshift('全部');
				// 将数据按照list,也就是列选择器所需要的字段来拼接
				data.forEach((item, index) => {
					var data2 = {
						"label": item,
						"value": index,
					}
					// 生成二级列表
					then.tiwaiPage.push(data2);
				})

				// 三级去重
				card = ([...new Set(card)]);
				//三级数据本身没有全部这个字段 在顶部添加一个全部
				card.unshift('全部');
				// 将数据按照list,也就是列选择器所需要的字段来拼接
				card.forEach((item, index) => {
					var data2 = {
						"label": item,
						"value": index,
					}
					// 生成三级列表
					then.tiaozaoPage.push(data2);
				})
				// 用户初次进入没有选中.默认给第一个  三级
				if (!then.contHei3) {
					then.contHei3 = then.tiaozaoPage[0].label;
				}

			},
			// 按钮点击事件  判断是第几个按钮被点击  记录一下 
			dianji(e) {
				this.show = true;
				// console.log(e);
				this.Ydianji = e;
				if (e == 0) {
					this.list = this.maoPage;
				} else if (e == 1) {
					this.list = this.tiwaiPage;
				} else {
					this.list = this.tiaozaoPage;
				}
			},
			// 当列选择器弹出  点击了确认之后触发的事件
			// 注意返回值为一个数组,单列时取数组的第一个元素即可(只有一个元素)
			confirm(e) {
				var then = this;
				// 避免点击的是重复的  可不作任何操作
				if (then.contHei1 != e[0].label) {
					// 最后判断点击的是第几层的按钮  一二层按钮 对下级按钮层清空.最后会在初始化时添加上 保证上层数据发生变化时 下层数据展示第一条
					if (this.Ydianji == 0) { //犬猫
						this.contHei1 = e[0].label;
						this.contHei2 = "";
						this.contHei3 = "";
						this.chushihua();
					} else if (this.Ydianji == 1) { //体内体外
						this.contHei2 = e[0].label;
						this.contHei3 = "";
						this.chushihua();
					} else if (this.Ydianji == 2) { //病例
						this.contHei3 = e[0].label;
					}
				}
			},
		}
	}
</script>

<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}

	.contHei {
		width: 30%;
		height: 70rpx;
		display: flex;
		justify-content: center;
		align-items: center;
		border: 1px solid gray;
	}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值