Javascript 对象动态键值的过滤器对象
如何在javaScript或lodash中过滤具有动态键值的对象中的对象 我的数据是:Javascript 对象动态键值的过滤器对象,javascript,lodash,Javascript,Lodash,如何在javaScript或lodash中过滤具有动态键值的对象中的对象 我的数据是: var names = [ { name: 'c1', tags: { key1: 'value1-1', key2: 'value1-2', }, }, { name: 'c2', tags: { key1: 'value2-1', key2: 'value1-2', }, }, {
var names = [
{
name: 'c1',
tags: {
key1: 'value1-1',
key2: 'value1-2',
},
},
{
name: 'c2',
tags: {
key1: 'value2-1',
key2: 'value1-2',
},
},
{
name: 'c3',
tags: {
key3: 'value3-1',
key4: 'value3-2',
},
}
]
过滤数据为:
var filterData = {
key3: { 0: 'value3-1' },
key4: { 0: 'value3-2' }
}
我希望过滤器和过滤器后显示如下:
afterFilter = [
{
name: 'c3',
tags: {
key3: 'value3-1',
key4: 'value3-2',
}
}
]
第一个console.log段:
-过滤器在标记中包含键/VAL
第二个console.log段:
-完全相同的一组键/VAL(还检查它们的长度是否相同)
var名称=[{
名称:“c1”,
标签:{
键1:‘值1-1’,
键2:‘值1-2’,
},
},
{
名称:“c2”,
标签:{
键1:‘值2-1’,
键2:‘值1-2’,
},
},
{
名称:“c3”,
标签:{
键3:‘值3-1’,
键4:‘值3-2’,
},
}
]
变量filterData={
键3:‘值3-1’,
键4:“值3-2”
}
名字。推({
名称:“c4”,
标签:{
键1:‘皮尤’,
键2:“pew pew”,
键4:‘值3-2’,
键3:“值3-1”
}
})
//if_包含filterData的键/值的筛选器
console.log(
名称.过滤器(({
标签
})=>Object.entries(filterData).every([k,v])=>tags[k]==v))
)
//仅筛选与filterData完全相同的键/值顺序不敏感
常量计数=Object.keys(filterData).length
console.log(
名称.过滤器(
({
标签
}) =>
(标签=>
tags.length==count&&tags.every([k,v])=>filterData[k]==v))
(对象.条目(标签))
)
)
我不确定您的筛选数据的格式,因此我假设这也会起作用:
var filterdata = {
key3: 'value3-1',
key4: 'value3-2',
};
这样,您就可以对您的姓名数据集执行.filter()
:
const keys = Object.keys(filterData);
const res = names.filter((name) => {
let flag = true;
keys.forEach((key) => {
if (filterData[key] !== name.tags[key]) flag = false;
});
return flag;
});
// res === afterFilter
如果您保持密钥名称不变,则可以省略一些内容
希望这能有所帮助。你可以在这些方面做点什么
var names = [
{
name: 'c1',
tags: {
key1: 'value1-1',
key2: 'value1-2',
},
},
{
name: 'c2',
tags: {
key1: 'value2-1',
key2: 'value1-2',
},
},
{
name: 'c3',
tags: {
key3: 'value3-1',
key4: 'value3-2',
},
}
]
var path = "tags.key1";
var value = "value1-1"
var filtered = []
names.forEach(elem => {
var arr = path.split('.')
// make a copy so that you do not operate on original entry
var item = JSON.parse(JSON.stringify(elem));
while(arr.length) {
item = item && item[arr[0]]
arr.shift();
}
if (item === value) {
filtered.push(elem)
}
})
// Filtered is result
console.log(filtered)
Codepen:可能我收到了这个过滤器数据:var filterData={key3:'value3-1',key2:'value1-2'};