Отображение индекса объекта json в массив - PullRequest
0 голосов
/ 09 июля 2020

У меня есть сложный json объект, который я получаю из моего backend API. Я хочу сопоставить ключ для каждой пары значений ключа в моем объекте json. Я хочу получить уникальные ключи в моем объекте json и передать их sh в массив. Как я могу это реализовать. Пожалуйста, наставьте меня.

Keys: any = []; // array i want to push the keys of json data.
data: any = [];

this.testservice.getdata().subscribe((d: any[]) => { 
this.data = d;
})

// sample of my data

{
  "test1" : [{
      "t1": ...,
      "t2": ...
      "t3":  {
        "t31": {},
        "t32": {
          "t321": {
            "t3211": {},
            "t3212": {},
          }
        }
      }
    }
  ],
  "test2" : [{
     "t21": ...,
     "t22": ...
     "t23":  {
       "t231": {},
       "t232": {
         "t2321": {
           "t23211": {},
           "t23212": {},
         }
       }
     }
   }
  ]
}


// my keys array should look like.
keys = ["test1", "test2", "t1", "t2", "t3", "t31", "t32", "t321", "t3211", "t3212",
        "t21", "t22", "t23", "t231", "t232", "t2321", "t2322", "t23211", "t23212"]

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Вот вам стартовая функция, я не настраивал ее точно, но она должна помочь вам начать

const getKeys = obj =>
  Array.isArray(obj)
    ? obj.reduce(
        (keys, item) => {
          getKeys(item)
            .forEach(key => { if (!keys.includes(key)) { keys.push(key); } });
          return keys;
        },
        []
      )
    : obj && typeof obj === 'object'
    ? Object.keys(obj).reduce(
        (keys, key) => {
          if (!keys.includes(key)) {
            keys.push(key);
          }
          getKeys(obj[key])
            .forEach(k => { if (!keys.includes(k)) { keys.push(k); } });
          return keys;
        },
        []
      )
    : [];
    
console.log(
  getKeys(
    {
      prop1: [{ prop2: 1 }, { prop1: 2 }],
      prop3: { prop4: 1, prop2: 2 }
    }
  )
);
1 голос
/ 09 июля 2020

Таким образом, вы можете вызывать функцию рекурсивно, теперь не имеет значения, насколько глубок ваш объект.

let data = {
  "test1": [{
    "t1": {},
    "t2": {},
    "t3": {
      "t31": {},
      "t32": {
        "t321": {
          "t3211": {},
          "t3212": {},
        }
      }
    }
  }],
  "test2": [{
    "t21": {},
    "t22": {},
    "t23": {
      "t231": {},
      "t232": {
        "t2321": {
          "t23211": {},
          "t23212": {},
        }
      }
    }
  }]
}

let keys = []


let getKeys = (obj) => {

  for (let [key, value] of Object.entries(obj)) {
    if (!keys.includes(key)) {
      keys.push(key)
    }

    if (value instanceof Array) {
      if (!!value.length) {
        for (let innerVal of value) {
          getKeys(innerVal)
        }

      }
    } else if (typeof value === 'object') {
      getKeys(value)
    }
  }


}

getKeys(data)

console.log(keys)
0 голосов
/ 09 июля 2020
Object.keys(jsonToGetKeys); //returns array with the keys

Значит, вы можете использовать это так:

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