Получить все ключи / массива ключей в JSON Parse Object? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть образец JSON, как это

`{
  values:[{
    "name": "Base Url",
    "url": "https://kubemanagement-prod.kohls.com"
  },
  {
    "name": "Base Url newwww",
    "url": "https://batman.com"
  }]
}`

В настоящее время, когда я добавляю этот специфический JSON к lodash, _.keys дает мне результат ["0", "1"], который в основном является индексом первого и второго объекта 0 и 1.

Что я хочу, так это получить все ключи объекта JSON, включая свойства подобъектов. В этом случае ["values","0", "1","name","url"]

Кто-нибудь знает метод lodash или механизм для извлечения всех ключей, данных в сложном объекте JSON, на n-й уровень?

язык: угловой + машинопись

Ответы [ 4 ]

2 голосов
/ 02 июля 2019

Эта функция рекурсивно получает ключи из дерева объектов, используя _.keys() и _.flatMap() и _.union() для объединения списков ключей и получения только уникальных значений:

const getAllKeys = obj => _.union(
  _.keys(obj),
  _.flatMap(obj, o => _.isObject(o) ? getAllKeys(o) : [])
)

const arr = {"values": [{"name":"Base Url","url":"https://kubemanagement-prod.kohls.com"},{"name":"Base Url newwww","url":"https://batman.com"}]}

const result = getAllKeys(arr)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

И та же идея без lodash, используя Object.values() и Array.flatMap() для итерации текущего объекта (или массива), а также Array.concat() и Setчтобы сделать ключи уникальными:

const getAllKeys = obj => [...new Set([].concat(
  Object.keys(obj),
  Object.values(obj).flatMap(o => typeof o === 'object' ? getAllKeys(o) : [])
))]

const arr = {"values": [{"name":"Base Url","url":"https://kubemanagement-prod.kohls.com"},{"name":"Base Url newwww","url":"https://batman.com"}]}

const result = getAllKeys(arr)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

Без индексов массива:

const getAllKeys = obj => _.union(
  _.isArray(obj) ? [] : _.keys(obj),
  _.flatMap(obj, o => _.isObject(o) ? getAllKeys(o) : [])
)

const arr = {"values": [{"name":"Base Url","url":"https://kubemanagement-prod.kohls.com"},{"name":"Base Url newwww","url":"https://batman.com"}]}

const result = getAllKeys(arr)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
1 голос
/ 02 июля 2019

Для этого вам не нужен lodash, достаточно Object.keys. Вы просто пишете рекурсивную функцию, записываете в Set, возможно, преобразуете в массив, когда закончите:

const array = [
  {
    "name": "Base Url",
    "url": "https://kubemanagement-prod.kohls.com"
  },
  {
    "name": "Base Url newwww",
    "url": "https://batman.com"
  }
];

function addAll(set, entries) {
    for (const entry of entries) {
        set.add(entry);
    }
    return set;
}

function allKeys(obj/*: object|array*/, keys/*: Set<string>*/ = new Set()) {
    addAll(keys, Object.keys(obj));
    for (const entry of Object.values(obj)) {
        if (entry && typeof entry === "object") {
            allKeys(entry, keys);
        }
    }
    return keys;
}

console.log([...allKeys(array)]);

Или используя структуру в вашем редакторе:

const array = {
  values:[{
    "name": "Base Url",
    "url": "https://kubemanagement-prod.kohls.com"
  },
  {
    "name": "Base Url newwww",
    "url": "https://batman.com"
  }]
}

function addAll(set, entries) {
    for (const entry of entries) {
        set.add(entry);
    }
    return set;
}

function allKeys(obj/*: object|array*/, keys/*: Set<string>*/ = new Set()) {
    addAll(keys, Object.keys(obj));
    for (const entry of Object.values(obj)) {
        if (entry && typeof entry === "object") {
            allKeys(entry, keys);
        }
    }
    return keys;
}

console.log([...allKeys(array)]);
0 голосов
/ 02 июля 2019

Если вы используете машинопись, почему бы не использовать Object.entries или Object.values ​​для этого?

Вам необходимо добавить в tsconfig следующую строку:

lib: [ ...... "Es2018", ]

0 голосов
/ 02 июля 2019

Как насчет

const arr = {"values": [{"name":"Base Url","url":"https://kubemanagement-prod.kohls.com"},{"name":"Base Url newwww","url":"https://batman.com"}]}

let result1 = Object.keys(arr) // get the object keys which is "values"
let result2 = Object.keys(arr[result1]); // get the keys of the object name "0,1" here
let result3 = Object.keys(arr[result1][0]); // get property names of one object "name and url" here
let resutltant = result1.concat(result2, result3) // "merge array"
console.log(resutltant)

Предполагая, что имена свойств вашего объекта останутся постоянными

...