Попробуйте получить значения ключей рекурсивно из JSON в Angular 5 - PullRequest
0 голосов
/ 24 мая 2018

Я хочу получить все значения ключа из файла JSON.Например, в:

{
 "total_count": 6,
 "incomplete_results": false,
 "items": [
  {
    "url": "https://api.github.com/repos/Samhot/GenIHM/issues/6",
    "id": 293237635,
    "number": 6,
    "title": "Rechercher des documents",
    "user": {
      "login": "Samhot",
      "id": 7148311
 ]
}

Я хотел бы получить:
["total_count", "incomplete_results", "items", "url", "url", "number", "title", "user", "login", "id"]

У меня есть функция, которая возвращает содержимое моего JSON в наблюдаемой:

  getConfig(): Observable<any> {
    return this.http.get<any>(this.myURL);
  }

После этого данные переформатируются с помощью .map, чтобы получить только ключи с функцией Object.keys():

  merge()
  .pipe(
    startWith({}),
    switchMap(() => {
      return this.getConfig();
    }),
    map(data => {
      return Object.keys(data.items[0]);
      }
    )
  )
  .subscribe(data => {
    this.dispo = data;
  });

Моя проблема в том, что я получаю только ключи, находящиеся на уровнео JSON, о котором я говорил ( data.items [0] ), а не о восходящих или потомках.

Конечно, я могу создавать несколько запросов, но он просит заранее знать структуру JSON, я хочу сделать его универсальным ...

Какможно сделать массив со всеми моими ключами независимо от структуры JSON?

Заранее спасибо!

1 Ответ

0 голосов
/ 24 мая 2018

Вам необходимо выполнить рекурсивную функцию, например:

function getDeepKeys(obj) {
  
    const keys = Object.keys(obj);

  const childKeys = keys
    .map(key => obj[key])
    .map(
      value =>
        Array.isArray(value)
          ? getDeepKeys(value[0])
          : typeof value === "object"
            ? getDeepKeys(value)
            : []
    )
    .reduce((acc, keys) => [...acc, ...keys], []);
  return [...keys, ...childKeys];
}

const obj = {
  total_count: 6,
  incomplete_results: false,
  items: [
    {
      url: "https://api.github.com/repos/Samhot/GenIHM/issues/6",
      id: 293237635,
      number: 6,
      title: "Rechercher des documents",
      user: {
        login: "Samhot",
        id: 7148311
      }
    },
    {
      url: "https://api.github.com/repos/Samhot/GenIHM/issues/6",
      id: 293237635,
      number: 6,
      title: "Rechercher des documents",
      user: {
        login: "Samhot",
        id: 7148311
      }
    }
  ]
};

console.log(getDeepKeys(obj));

Который тогда вы бы использовали как map(getDeepKeys).Обратите внимание, что эта функция предполагает, что все элементы в вашем массиве имеют одинаковую схему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...