我有一个嵌套对象。我需要通过子对象的属性将其过滤掉,但只能获取键。
到目前为止,我已经尝试过首先将属性 id 注入每个子对象,并将该对象的键指定为其值。然后继续过滤对象,比较属性(如果它与查询匹配),然后返回注入的属性 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)
它目前返回我想要的结果,但是我感觉自己像个骗子。有没有一种方法而不必注入其他属性来确定密钥?我觉得自己想念什么,但是我无法解决这个问题。
答案 0 :(得分:1)
您可以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))
答案 1 :(得分:1)
一个更优雅的解决方案是使用reduce
功能,如果您发现自己使用filter
和map
,则可以(并且应该始终)使用该功能:
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;
}, []);
}