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

时间:2019-06-19 06:53:42

标签: 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 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)

它目前返回我想要的结果,但是我感觉自己像个骗子。有没有一种方法而不必注入其他属性来确定密钥?我觉得自己想念什么,但是我无法解决这个问题。

2 个答案:

答案 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功能,如果您发现自己使用filtermap,则可以(并且应该始终)使用该功能:

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;
  }, []);
}