有这么一个业务需求,筛选条件是一个级联选择器,可多选,接口的入参需要传选中的最下级组成的集合。
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;
}
两种方法都可以满足需求,看自己喜欢哪种吧。