el-cascader多选级联选择器,取值为最后一级数据

本文介绍了在使用 Vue 和 Element UI 的 el-cascader 组件时,如何实现多选级联选择器获取最后一级数据的策略。当选择不同层级时,根据特定条件取不同层级的值,例如只选择一级或包含多级时仅取最后一级。文中提供了两种实现方法,可以按需选择合适的方式。
摘要由CSDN通过智能技术生成


有这么一个业务需求,筛选条件是一个级联选择器,可多选,接口的入参需要传选中的最下级组成的集合。

1、问题:

在这里插入图片描述
在这里插入图片描述

要求是: 如果只勾选了一级,就取一级;如果同时勾选了一级和二级,那结果只取二级;如果同时勾选了一级、二级和三级,那结果只取三级

结果为: [‘群众求助’, ‘盗窃’, ‘聚众哄抢’]

2、解决思路

我的思路是先取每个数组最后一个元素组成一个集合,然后判断这个元素在所有数据中出现的次数,如果只有一次就留下,组成最后的集合。

3、实现方法
// template 组件
<el-cascader
    ref="cascader"
    placeholder="请选择类别-类型-细类"
    v-model="jqflArr"
    :options="jqflList"
    :props="cascaderDefaultProps"
    collapse-tags
    :separator="'-'"
    filterable
    class="cascader mr16"
    @change="chooseJqfl"
></el-cascader>

下面有两种实现方式:

第一种方式:
/**
 * @description: 过滤分类
 * @param {array} params 选中分类数据
 * @return {string} 最终提交的分类参数(传选中的最下级,用英文逗号隔开)
 */
private chooseJqfl(params: any[]) {
    let onceArray: any[] = []; // 每个数组最后一项元素组成的集合
    let newNum: any[] = []; // 各元素出现的次数
    let finalArray: any[] = []; // 最终集合
    if (params.length > 0) {
        params.forEach((item: any) => {
            onceArray.push(item[item.length - 1]);
        });
        const num = params.flat();
        const map = new Map();
        for (let i of num) {
            if (!map.has(i)) {
                map.set(i, 1);
            } else {
                map.set(i, map.get(i) + 1);
            }
        }
        newNum = [...map.entries()]
            .filter((it) => it[1] == 1)
            .map((it) => it[0]);

        for (let i = 0; i < onceArray.length; i++) {
            if (newNum.indexOf(onceArray[i]) > -1) {
                finalArray.push(onceArray[i]);
            }
        }
    }
    this.searchOption.Jqfldms = finalArray;
}
第二种方式:
/**
 * @description: 过滤分类
 * @param {array} params 选中分类数据
 * @return {string} 最终提交的分类参数(传选中的最下级,用英文逗号隔开)
 */
private chooseJqfl(params: any[]) {
    let finalArray: any[] = []; 
    if (params.length > 0) {
        const uniqueIn = (arr: any) => (x: any) => 1 == arr.filter((v: any) => v == x).length;
        const appendLastId = (result: any, ids: any) => [...result, ids[ids.length - 1]];
        const flatted = params.flat();
        const lastIds = params.reduce(appendLastId, []);
        finalArray = lastIds.filter(uniqueIn(flatted));
    }
    this.searchOption.Jqfldms = finalArray;
}

两种方法都可以满足需求,看自己喜欢哪种吧。

end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值