Получить все значения определенного ключа из файла Json

[
   {
      "id":"0001",
      "type":"donut",
      "name":"Cake",
      "ppu":0.55,
      "batters":{
         "batter":[
            {
               "id":"1001",
               "type":"Regular"
            },
            {
               "id":"1002",
               "type":"Chocolate"
            }
         ]
      },
      "topping":[
         {
            "id":"5002",
            "type":"Glazed"
         }
         {
            "id":"5004",
            "type":"Maple"
         }
      ]
   },
   {
      "id":"0002",
      "type":"donut",
      "name":"Raised",
      "ppu":0.55,
      "batters":{
         "batter":[
            {
               "id":"1001",
               "type":"Regular"
            }
         ]
      },
      "topping":[
         {
            "id":"5003",
            "type":"Chocolate"
         },
         {
            "id":"5004",
            "type":"Maple"
         }
      ]
   },
   {
      "id":"0003",
      "type":"donut",
      "name":"Old Fashioned",
      "ppu":0.55,
      "batters":{
         "batter":[
            {
               "id":"1001",
               "type":"Regular"
            },
            {
               "id":"1002",
               "type":"Chocolate"
            }
         ]
      },
      "topping":[
         {
            "id":"5001",
            "type":"None"
         },
         {
            "id":"5004",
            "type":"Maple"
         }
      ]
   }
]

Ожидаемый результат: [пончик, обычный, шоколад, глазурованный, клен, пончик, обычный, шоколад, клен, пончик, обычный, шоколад, нет, клен]

Получите все значения ключа (типа) из вышеприведенного JSon в массив, включая всех дочерних элементов. Прилагается образец JSON, а также ожидаемый результат. Есть ли для этого какая-либо функция _lodash или любая функция Javascript тоже подойдет.

«все значения ключа (типа)» - это просто [пончик, пончик, пончик]... Вам также необходимо проанализировать ключи теста и топпинга. что ты уже испробовал?

OneCricketeer 11.07.2024 07:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
75
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Попробуй это:

JSON.stringify([{"id":"0001","type":"donut","name":"Cake","ppu":0.55,"batters":{"batter":[{"id":"1001","type":"Regular"},{"id":"1002","type":"Chocolate"}]},"topping":[{"id":"5002","type":"Glazed"},{"id":"5004","type":"Maple"}]},{"id":"0002","type":"donut","name":"Raised","ppu":0.55,"batters":{"batter":[{"id":"1001","type":"Regular"}]},"topping":[{"id":"5003","type":"Chocolate"},{"id":"5004","type":"Maple"}]},{"id":"0003","type":"donut","name":"Old Fashioned","ppu":0.55,"batters":{"batter":[{"id":"1001","type":"Regular"},{"id":"1002","type":"Chocolate"}]},"topping":[{"id":"5001","type":"None"},{"id":"5004","type":"Maple"}]}]).match(/(?<=["']type["']:\s*["'])(\w+)/g)

Кстати, ваш объект json имеет неправильный формат.

"topping":[
     {
        "id":"5002",
        "type":"Glazed"
     }
     {
        "id":"5004",
        "type":"Maple"
     }
  ]

Между 5002 и 5004 должна быть запятая.

Можно придумать множество примеров, для которых это не сработает.

trincot 11.07.2024 08:24

Попробуйте это:

  1. Включите Lodash через CDN в ваш HTML-файл.
  2. Функция getAllValuesByKey предназначена для рекурсивного поиска типа ключа и сбора его значений.

 const data = [
         {
            "id": "0001",
            "type": "donut",
            "name": "Cake",
            "ppu": 0.55,
            "batters": {
               "batter": [
                  {
                     "id": "1001",
                     "type": "Regular"
                  },
                  {
                     "id": "1002",
                     "type": "Chocolate"
                  }
               ]
            },
            "topping": [
               {
                  "id": "5002",
                  "type": "Glazed"
               },
               {
                  "id": "5004",
                  "type": "Maple"
               }
            ]
         },
         {
            "id": "0002",
            "type": "donut",
            "name": "Raised",
            "ppu": 0.55,
            "batters": {
               "batter": [
                  {
                     "id": "1001",
                     "type": "Regular"
                  }
               ]
            },
            "topping": [
               {
                  "id": "5003",
                  "type": "Chocolate"
               },
               {
                  "id": "5004",
                  "type": "Maple"
               }
            ]
         },
         {
            "id": "0003",
            "type": "donut",
            "name": "Old Fashioned",
            "ppu": 0.55,
            "batters": {
               "batter": [
                  {
                     "id": "1001",
                     "type": "Regular"
                  },
                  {
                     "id": "1002",
                     "type": "Chocolate"
                  }
               ]
            },
            "topping": [
               {
                  "id": "5001",
                  "type": "None"
               },
               {
                  "id": "5004",
                  "type": "Maple"
               }
            ]
         }
      ];

      function getAllValuesByKey(obj, key) {
         const result = [];
         function recursiveSearch(obj) {
            if (_.isObject(obj)) {
               _.forOwn(obj, (value, k) => {
                  if (k === key) {
                     result.push(value);
                  }
                  recursiveSearch(value);
               });
            } else if (_.isArray(obj)) {
               obj.forEach(item => recursiveSearch(item));
            }
         }
         recursiveSearch(obj);
         return result;
      }

      const types = getAllValuesByKey(data, 'type');
      console.info(types); 
<html lang = "en">
<head>
   <meta charset = "UTF-8">
   <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
   <title>Extract JSON Values</title>
   <script src = "https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>
</head>
<body>
</body>
</html>

Это хороший кандидат для написания функции-генератора (и рекурсии):

function* valuesForKey(data, key) {
    if (Object(data) !== data) return; // It's not an object
    if (Object.hasOwn(data, key)) yield data[key];
    for (const child of Object.values(data)) yield* valuesForKey(child, key);
}

const data = [{"id":"0001","type":"donut","name":"Cake","ppu":0.55,"batters":{"batter":[{"id":"1001","type":"Regular"},{"id":"1002","type":"Chocolate"}]},"topping":[{"id":"5002","type":"Glazed"},{"id":"5004","type":"Maple"}]},{"id":"0002","type":"donut","name":"Raised","ppu":0.55,"batters":{"batter":[{"id":"1001","type":"Regular"}]},"topping":[{"id":"5003","type":"Chocolate"},{"id":"5004","type":"Maple"}]},{"id":"0003","type":"donut","name":"Old Fashioned","ppu":0.55,"batters":{"batter":[{"id":"1001","type":"Regular"},{"id":"1002","type":"Chocolate"}]},"topping":[{"id":"5001","type":"None"},{"id":"5004","type":"Maple"}]}];
const keys = [...valuesForKey(data, "type")];
console.info(keys);
Ответ принят как подходящий

Я думаю, вам нужна рекурсивная функция для извлечения всех значений по ключу.

  • Будьте осторожны с большими JSON и памятью.
function extractValuesByKey(obj, field) {
  if (!obj) return [];
  if (typeof obj !== "object") return [];
  if (Array.isArray(obj))
    return obj.map((value) => extractValuesByKey(value, field)).flat();

  let result = [];
  Object.keys(obj).forEach((key) => {
    if (key === field) result.push(obj[key]);
    else result = result.concat(extractValuesByKey(obj[key], field));
  });
  return result;
}

В библиотеке lodash есть готовые функции, вы можете их использовать. Вот код для того же самого.

const allTypes = _.flatMap(jsonArray, (obj) => [
    obj.type,
    ..._.flatMap(obj.batters.batter, (obj) => [obj.type]),
    ..._.flatMap(obj.topping, (obj) => [obj.type]),
]);

Я использовал плоскую карту внутри плоской карты, чтобы сохранить порядок вывода.

если вы не хотите поддерживать порядок, вы можете использовать функцию concat, предоставляемую библиотекой lodash.

const allTypes = _.concat(
    _.map(jsonArray, 'type'),
    _.map(_.flatMap(jsonArray, 'batters.batter'), 'type'),
    _.map(_.flatMap(jsonArray, 'topping'), 'type')
);

Вы можете использовать метод JavaScript, чтобы получить желаемый результат.

    const types = [];
    
    jsonArray.forEach(item => {
        // Extract "type" from the current object
        if (item.type) {
            types.push(item.type);
        }

        // Recursively extract "type" from nested "batter" array
        if (item.batters && item.batters.batter) {
            item.batters.batter.forEach(batter => {
                if (batter.type) {
                    types.push(batter.type);
                }
            });
        }

        // Recursively extract "type" from nested "topping" array
        if (item.topping) {
            item.topping.forEach(topping => {
                if (topping.type) {
                    types.push(topping.type);
                }
            });
        }
    });

здесь jsonArray — ваш вклад.

Другие вопросы по теме