js 数组方法,记录多位数组内筛选出指定的数据

159 阅读1分钟

记录在工作中,做功能时遇到的一个需求,将接口里面返回的数据,筛选出与指定的 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;  
    });  
}