SOURCE

const obj = {
    a:1,
    b:"2",
    c:{
        d:[1,2,3],
    },
    e:[1,3,4,5],
    b1:[{a:1},{a:2},{a:3}],
    g:{
        f:[1,2,3,4,5,4,67]
    }
}

// console.log(_.at(obj,'a'))

// console.log(_.at(obj,'a')[0])

// console.log(_.at(obj,['a','b','c.d[0]']))

// console.log(_.at(obj,['a','b','c.d[0-1]']))


// x.x[0-2] --> [x.x[0],x.x[1],x.x[2]]
// [x.x1,x.x[0-2]] -> [x.x1,x.x[0],x.x[1],x.x[2]]

// {} 表示对Array进行filter并将结果返回  {'x.x':(item,index)=>{return item.id == 12}} 





function str2Arr(str){
    const r = /(\S+)\[(\d+)-(\d+)\]$/;
    const re = str.match(r)
    if(re){
        const arr = [];
        for(let i = re[2]; i <= re[3]; i ++){
            arr.push(`${re[1]}[${i}]`)
        }
        return arr;
    }else {
        return str;
    }
}
function arrFilter(target,obj){
    if(!Object.keys(obj).length){
        return []
    }
    const result = [];
    Object.keys(obj).forEach(key=>{
        if(typeof obj[key] !== 'function'){
            return;
        }
        const [r_item] = _.at(target,key);
        if(!Array.isArray(r_item)){
            result.push(r_item)
        }else{
            const f_r = r_item.filter(obj[key])
            result.push(...f_r);
        }
    })
    return result;
}
function expand_at(obj,arg){
    if(typeof arg === 'string'){
        const path = str2Arr(arg);
        return _.at(obj,path);
    }else if(Array.isArray(arg)){
        const a_f_r = [];
        for(let i = 0; i < arg.length; i ++){
            if(typeof arg[i] === 'string'){
                const res = str2Arr(arg[i])
                if(Array.isArray(res)){
                    arg.splice(i,1,...res)
                }
            }else if(Object.prototype.toString.call(arg[i]) === '[object Object]'){
                a_f_r.push({
                    p:i,
                    v:arrFilter(obj,arg[i])
                })
            }
        }
        if(a_f_r.length){
            const result = _.at(obj,arg);
            a_f_r.forEach(item=>{
                result.splice(item.p,1,item.v)
            })
            return result;
        }else{
            return _.at(obj,arg)
        }
    }else if(Object.prototype.toString.call(arg) === '[object Object]'){
        return arrFilter(obj,arg)
    }else {
        console.error(`paths应为 string 或 string[] 或 {'key':filter_function}`)
        return []
    }
}

// 条件筛选 {"e":(item)=>{return item <= 4}}

console.log(expand_at(obj,[{"e":(item)=>{return item <= 2},"c.d":item=>item<2},'g.f','g.f[0-2]','b',{"e":(item)=>{return item <= 4}},{"e":(item)=>{return item <= 2}}]),'is result')
console 命令行工具 X clear

                    
>
console