Как искать в многослойных вложенных объектах по ключам в js - PullRequest
0 голосов
/ 30 апреля 2020

Я хотел бы искать в многослойном вложенном объекте в javascript. Количество слоев является динамическим c. Не фиксировано. Допустим, у меня есть такой объект.

       data={
            "_index": "sample_data_logs",
            "_type": "_doc",
            "_id": "lDMTgnEBbYNxp5GHN-gj",
            "_version": 1,
            "_score": 7.6343846,
            "_source": {
                "agent": "Mozilla/4.0",
                "bytes": 6948,
                "clientip": "172.3.128.226",
                "extension": "",
                "geo": {
                    "srcdest": "IN:BY",
                    "src": "IN",
                    "dest": "BY",
                    "coordinates": {
                        "lat": 41.92076333,
                        "lon": -71.49138139
                    }
                },
                "host": "www.host.co",
                "index": "sample_data_logs",
                "ip": "172.3.128.226",
                "machine": {
                    "ram": 5368709120,
                    "os": "win 8"
                },
                "memory": null,
                "phpmemory": null,
                "request": "/apm",
                "response": 200,
                "tags": [
                    "success",
                    "security"
                ],
                "timestamp": "2020-04-13T11:05:05.551Z",
                "url": "https://www.elastic.co/downloads/apm",
                "utc_time": "2020-04-13T11:05:05.551Z"
            }
        }
       keys= ["_index","bytes","os","tags"];

И у меня есть массив значений ключей для поиска или фильтрации данных.
Как я могу это сделать? Используя loda sh Я пытался

_.pick(data_, keys);

Я не получил ожидаемых результатов, которые должны быть:

                   {
                    "_index": "sample_data_logs",
                    "bytes": 6948,
                    "os": "win 8",
                    "tags": [
                      "success",
                      "security"
                     ]
                    }

Каков наилучший способ сделать это? это может быть сделано в ванили js?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

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

Объяснение:

У нас есть функция traverse, которая принимает:

  • объект (называемый data),
  • список ключей (называемый keys),
  • и объект, который содержит текущий результат (найденные пары ключ / значение) называется result)

В функции traverse мы go над клавишами первого уровня данных объекта (используя Object.keys(data)) и проверяем, находится ли каждый из них в keys список, и если это так, мы добавляем эту пару ключ / значение к результату и go к следующему.

Но если его нет в keys, то нам нужно проверить если этот ключ является вложенным объектом, то мы делаем это с помощью следующих условий:

if (
  data[k] &&
  typeof data[k] === "object" &&
  Object.keys(data[k]).length > 0
)
  • Первый (data[k]) используется для исключения null и undefined

  • Второй (typeof data[k] === "object") используется для проверки, является ли значение объектом

  • Третье условие используется для исключения собственных объектов как Date
0 голосов
/ 30 апреля 2020

Вы можете использовать:

const object1 = {
  a: 'somestring',
  b: 42
};

for (let [key, value] of Object.entries(object1)) {
  if (key === target) {// do somethings}
}

Если ключи соответствуют вашим потребностям, вы можете провести лечение?

Надеюсь, это поможет

...