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]
}
}
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 []
}
}
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