Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取另一个对象中属性值与查询匹配的对象的所有键_Javascript_Arrays_Object_Filter_Key Value - Fatal编程技术网

Javascript 获取另一个对象中属性值与查询匹配的对象的所有键

Javascript 获取另一个对象中属性值与查询匹配的对象的所有键,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, }

我有一个嵌套对象。我需要按子对象的属性过滤掉它们,但只获取密钥

到目前为止,我已尝试首先将属性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)

它目前返回我想要的结果,但我觉得我作弊了。有没有一种方法可以做到这一点,而不必注入另一个属性来确定密钥?我觉得我错过了什么,但我不能对这件事耿耿于怀

不必添加额外的键,然后过滤值,您可以像下面这样选择键:

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)
就可以了。