[
{
"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 тоже подойдет.
Попробуй это:
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 должна быть запятая.
Можно придумать множество примеров, для которых это не сработает.
Попробуйте это:
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);
Я думаю, вам нужна рекурсивная функция для извлечения всех значений по ключу.
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 — ваш вклад.
«все значения ключа (типа)» - это просто [пончик, пончик, пончик]... Вам также необходимо проанализировать ключи теста и топпинга. что ты уже испробовал?