Получить все ключи объектов в другом объекте со значением свойства, соответствующим запросу - PullRequest
1 голос
/ 19 июня 2019

У меня есть вложенный объект.Мне нужно отфильтровать их по свойству дочернего объекта, но получить только ключи.

До сих пор я пытался сначала добавить свойство 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 ]

1 голос
/ 19 июня 2019

Более элегантным решением является использование функции 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;
  }, []);
}
1 голос
/ 19 июня 2019

Вместо добавления дополнительного ключа и последующей фильтрации значений вы можете вместо этого 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...