Javascript 获取另一个对象中属性值与查询匹配的对象的所有键
我有一个嵌套对象。我需要按子对象的属性过滤掉它们,但只获取密钥 到目前为止,我已尝试首先将属性id注入每个子对象,并将对象的键指定为其值。然后继续筛选对象,比较属性是否与查询匹配,然后返回注入的属性idJavascript 获取另一个对象中属性值与查询匹配的对象的所有键,javascript,arrays,object,filter,key-value,Javascript,Arrays,Object,Filter,Key Value,我有一个嵌套对象。我需要按子对象的属性过滤掉它们,但只获取密钥 到目前为止,我已尝试首先将属性id注入每个子对象,并将对象的键指定为其值。然后继续筛选对象,比较属性是否与查询匹配,然后返回注入的属性id let test_obj = { A: { a: 1, b: 1, }, B: { a: 1, b: 2, }, C: { a: 1, b: 3, }
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)
它目前返回我想要的结果,但我觉得我作弊了。有没有一种方法可以做到这一点,而不必注入另一个属性来确定密钥?我觉得我错过了什么,但我不能对这件事耿耿于怀 不必添加额外的键,然后过滤值,您可以像下面这样选择键:
const test\u obj={
A:{
答:1,,
b:1,
},
B:{
答:1,,
b:2,
},
C:{
答:1,,
b:3,
}
}
常量查询=(obj,prop,val)=>Object.keys(obj.filter)(k=>obj[k][prop]==val);
console.log(query(test_obj,“b”,2))
一个更优雅的解决方案是使用reduce
功能,如果您使用过滤器和映射
,您可以(而且应该)使用该功能:
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;
}, []);
}
在声明变量时,请使用var
、let
或const
——您不想隐式声明全局变量。还要注意,val
将等于test_obj
中的最后一项。您想查询test_obj
以返回具有特定键对的主对象吗?为此,您需要key:val对,因此query(test_obj,“b”,2)
就可以了。