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

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 功能,如果您发现自己正在使用 filtermap:[=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;
  }, []);
}