记录在工作中,做功能时遇到的一个需求,将接口里面返回的数据,筛选出与指定的
id值相同的的数据,连同它的父级一块儿返回,方法中做了两种处理,一种是传字符串的,一种是传数组的;
const data = [
{
id: 22,
rows: [
{ id: "673627", name: "aaaa", address: "5" },
{ id: "333", name: "ccc", address: "4" },
{ id: "999", name: "ddd", address: "44" }
]
},
{
id: 33,
rows: [
{ id: "899", name: "ggg", address: "33" },
{ id: "333", name: "ttt", address: "222" },
{ id: "999", name: "kkk", address: "111" }
]
}
]
/**
* 在多维数组内筛选出需要的数据
* @param data:多级数组
* @param value:需要筛选出的数据
* @param name:与筛选数据做对比的字段
* @returns {*}
* const value = ["1510465824593285121", "1513344014760284161", "1514068113300131842", "202112111039001001"];
* const a1 = cloneDeep(data) // 一个功能使用多次该方法时,建议将原始数组深拷贝一下,避免数据混淆
* const a2 = cloneDeep(data)
* console.log(filtersData(a1, '202112111039001001'),'====1');
* console.log(filtersData(a2, value),'===a2');
*/
export const filtersData = (data, value, name = 'id') => {
return data.filter(item => {
let val = value; // 筛选数据为字符串
if (isArray(value)) val = value.find(i => item[name] === i); // 筛选数据为数组
// 判断 当前 数据内指定的字段 是否与 需要筛选的数据相等
let hasValue = item[name].indexOf(val) !== -1;
// 循环 item
Object.keys(item).map(key => {
// 判断 item 内 是否有 children
if (key === "children") {
// 当有 children 时,再次调用递归
item.children = filtersData(item.children, value);
// 当 item 内有 children 并且 children 的长度大为 0 时,为 true
hasValue = item.children && item.children.length > 0;
}
})
// 返回 hasValue
return hasValue;
});
}