过滤具有多个属性的多个数组对象

Jak*_*rbo 3 javascript underscore.js typescript lodash

我正在尝试创建一个过滤器函数,该函数可以从给定的字符串键集中返回与我正在寻找的值匹配的数据结果

数组的例子:

let data = [
 { id:1 , data:{ name:"sample1",address:{ cat:"business" } } },
 { id:2 , data:{ name:"sample2",address:{ cat:"office"  }  } },
 { id:3 , data:{ name:"sample3",address:{ cat:"office"  } } },
 { id:4 , data:{ name:"sample4",address:{ cat:"office"  }  } }
 { id:5 , data:{ name:"sample5",address:{ cat:"home"  } } }
 { id:6 , data:{ name:"sample6",address:{ cat:"home"  }  } }
]



function filter( collection , value ,key ){
  //code 
}


let result = filter( data , "business" , [ "data","address","cat" ] )

console.log(result)
Run Code Online (Sandbox Code Playgroud)

预期结果是

{id:1,数据:{名称:“ sample1”,地址:{cat:“业务”}}},

Edd*_*die 5

您可以filter用来搜索数据。使用reduce构建键。

注意:filter返回匹配元素的数组。如果您只喜欢第一场比赛,可以使用find

let data = [
  { id:1 , data:{ name:"sample1",address:{ cat:"business" } } },
  { id:2 , data:{ name:"sample2",address:{ cat:"office"  }  } },
  { id:3 , data:{ name:"sample3",address:{ cat:"office"  } } },
  { id:4 , data:{ name:"sample4",address:{ cat:"office"  }  } },
  { id:5 , data:{ name:"sample5",address:{ cat:"home"  } } },
  { id:6 , data:{ name:"sample6",address:{ cat:"home"  }  } }
];


function filter(collection, value, key) {
  return collection.filter(o => key.reduce((c, v) => c[v] || {}, o) === value);
}

let result = filter(data, "business", ["data", "address", "cat"])

console.log(result)
Run Code Online (Sandbox Code Playgroud)