获取具有与查询匹配的 属性 值的另一个对象中对象的所有键
Get all the keys of objects within another object with property value that matches the query
我有一个嵌套对象。我需要通过子对象的 属性 过滤掉它们,但只获取键。
到目前为止,我已经尝试过首先将 属性 id 注入每个子对象并将对象的键作为其值。然后继续过滤对象,比较属性是否匹配查询,然后return注入属性id.
let test_obj = {
A: {
a: 1,
b: 1,
},
B: {
a: 1,
b: 2,
},
C: {
a: 1,
b: 3,
}
}
let identify = (e) => {
for (e of Object.entries(e)){
key = e[0];
val = e[1];
val.id = key;
console.log(e);
}
}
identify(test_obj);
let query = (test_obj,prop,val) => (Object.values(test_obj).filter(o => o[prop] == val).map(o=>o.id));
let result = query(test_obj,"b",2);
console.log(result)
它目前 return 我想要的结果,但我觉得我作弊了。有没有办法做到这一点而不必注入另一个 属性 来确定密钥?我觉得我错过了什么,但我无法解决这个问题。
您可以 filter
键,而不是添加额外的键,然后过滤值:
const test_obj = {
A: {
a: 1,
b: 1,
},
B: {
a: 1,
b: 2,
},
C: {
a: 1,
b: 3,
}
}
const query = (obj, prop, val) => Object.keys(obj).filter(k => obj[k][prop] === val);
console.log(query(test_obj, "b", 2))
一个更优雅的解决方案是使用 reduce
功能,如果您发现自己正在使用 filter
和 map
:[=14=,您可以(并且总是应该)使用它]
function findKeysForValue(test_obj, value) {
return Object.entries(test_obj).reduce((myKeys, [objKey, outerValue]) => {
if (Object.values(outerValue).find(nestedValue => nestedValue === value)) {
return [...myKeys, objKey];
}
return myKeys;
}, []);
}
我有一个嵌套对象。我需要通过子对象的 属性 过滤掉它们,但只获取键。
到目前为止,我已经尝试过首先将 属性 id 注入每个子对象并将对象的键作为其值。然后继续过滤对象,比较属性是否匹配查询,然后return注入属性id.
let test_obj = {
A: {
a: 1,
b: 1,
},
B: {
a: 1,
b: 2,
},
C: {
a: 1,
b: 3,
}
}
let identify = (e) => {
for (e of Object.entries(e)){
key = e[0];
val = e[1];
val.id = key;
console.log(e);
}
}
identify(test_obj);
let query = (test_obj,prop,val) => (Object.values(test_obj).filter(o => o[prop] == val).map(o=>o.id));
let result = query(test_obj,"b",2);
console.log(result)
它目前 return 我想要的结果,但我觉得我作弊了。有没有办法做到这一点而不必注入另一个 属性 来确定密钥?我觉得我错过了什么,但我无法解决这个问题。
您可以 filter
键,而不是添加额外的键,然后过滤值:
const test_obj = {
A: {
a: 1,
b: 1,
},
B: {
a: 1,
b: 2,
},
C: {
a: 1,
b: 3,
}
}
const query = (obj, prop, val) => Object.keys(obj).filter(k => obj[k][prop] === val);
console.log(query(test_obj, "b", 2))
一个更优雅的解决方案是使用 reduce
功能,如果您发现自己正在使用 filter
和 map
:[=14=,您可以(并且总是应该)使用它]
function findKeysForValue(test_obj, value) {
return Object.entries(test_obj).reduce((myKeys, [objKey, outerValue]) => {
if (Object.values(outerValue).find(nestedValue => nestedValue === value)) {
return [...myKeys, objKey];
}
return myKeys;
}, []);
}