Anonymous
Преобразование в иерархический массив в JavaScript
Сообщение
Anonymous » 15 янв 2026, 00:45
Пример скрипта
Я хочу преобразовать эти данные JSON
Код: Выделить всё
var data = [
{
"computer": 24,
"brand": "Italy A",
"phone": 0,
"country": "Italy"
},
{
"brand": "Italy C",
"computer": 0,
"phone": 0,
"country": "Italy"
},
{
"brand": "Brazil B",
"computer": 0,
"phone": 22,
"country": "Brazil"
},
{
"computer": 0,
"brand": "Brazil D",
"phone": 62,
"country": "Brazil"
},
{
"computer": 34,
"brand": "US E",
"phone": 41,
"country": "US"
}
];
в иерархическую форму для графика d3:
Код: Выделить всё
{
"name": "categories",
"children": [
{
"name": "phone",
"children": [
{
"name": "US",
"children": [
{
"brand": "US E",
"size": 41
}
]
},
{
"name": "Brazil",
"children": [
{
"brand": "Brazil B",
"size": 22
},
{
"brand": "Brazil D",
"size": 62
}
]
},
{
"name": "Italy",
"children": []
}
]
},
{
"name": "computer",
"children": [
{
"name": "US",
"children": [
{
"brand": "US E",
"size": 34
}
]
},
{
"name": "Brazil",
"children": []
},
{
"name": "Italy",
"children": [
{
"brand": "Italy A",
"size": 24
}
]
}
]
}
]
}
Я придумал этот код для создания формата:
Код: Выделить всё
function group_children(data){
var categories = ["phone","computer"];
var countries = ["US","Brazil","Italy"];
var object = {name:"categories",children:[]};
for(var c =0; c < categories.length;c++){
object.children.push({"name":categories[c],children:[]});
for(var con = 0;con < countries.length;con++){
object.children[c].children.push({"name":countries[con],"children":[]});
}
}
for(var i = 0;i < data.length;i++){
var row = data[i];
for(var c =0; c < categories.length;c++){
for(var con = 0;con < countries.length;con++){
var cat_key = categories[c],
country_key = countries[con];
if(row[cat_key] > 0){
if(object.children[c].name == cat_key && row.country == country_key){ object.children[c].children[con].children.push({brand:row["brand"],size:row[cat_key]});
}
}
}
}
}
return object;
}
Можно ли во время итерации не помещать страну в массив Children бренда или компьютера, если массив Children страны пуст?
Например, эти объекты следует удалить
Код: Выделить всё
// computer
{
"name": "Brazil",
"children": []
}
// phone:
{
"name": "Italy",
"children": []
}
Вот часть, которая помещает каждую страну в дочерний массив каждой категории:
Код: Выделить всё
for(var c =0; c < categories.length;c++){
object.children.push({"name":categories[c],children:[]});
for(var con = 0;con < countries.length;con++){
object.children[c].children.push({"name":countries[con],"children":[]});
}
}
Мой подход, вероятно, неправильный, поэтому любые другие предложения по преобразованию данных в эту иерархическую форму также приветствуются.
Подробнее здесь:
https://stackoverflow.com/questions/282 ... javascript
1768427101
Anonymous
Пример скрипта Я хочу преобразовать эти данные JSON [code]var data = [ { "computer": 24, "brand": "Italy A", "phone": 0, "country": "Italy" }, { "brand": "Italy C", "computer": 0, "phone": 0, "country": "Italy" }, { "brand": "Brazil B", "computer": 0, "phone": 22, "country": "Brazil" }, { "computer": 0, "brand": "Brazil D", "phone": 62, "country": "Brazil" }, { "computer": 34, "brand": "US E", "phone": 41, "country": "US" } ]; [/code] в иерархическую форму для графика d3: [code]{ "name": "categories", "children": [ { "name": "phone", "children": [ { "name": "US", "children": [ { "brand": "US E", "size": 41 } ] }, { "name": "Brazil", "children": [ { "brand": "Brazil B", "size": 22 }, { "brand": "Brazil D", "size": 62 } ] }, { "name": "Italy", "children": [] } ] }, { "name": "computer", "children": [ { "name": "US", "children": [ { "brand": "US E", "size": 34 } ] }, { "name": "Brazil", "children": [] }, { "name": "Italy", "children": [ { "brand": "Italy A", "size": 24 } ] } ] } ] } [/code] Я придумал этот код для создания формата: [code]function group_children(data){ var categories = ["phone","computer"]; var countries = ["US","Brazil","Italy"]; var object = {name:"categories",children:[]}; for(var c =0; c < categories.length;c++){ object.children.push({"name":categories[c],children:[]}); for(var con = 0;con < countries.length;con++){ object.children[c].children.push({"name":countries[con],"children":[]}); } } for(var i = 0;i < data.length;i++){ var row = data[i]; for(var c =0; c < categories.length;c++){ for(var con = 0;con < countries.length;con++){ var cat_key = categories[c], country_key = countries[con]; if(row[cat_key] > 0){ if(object.children[c].name == cat_key && row.country == country_key){ object.children[c].children[con].children.push({brand:row["brand"],size:row[cat_key]}); } } } } } return object; } [/code] Можно ли во время итерации не помещать страну в массив Children бренда или компьютера, если массив Children страны пуст? Например, эти объекты следует удалить [code] // computer { "name": "Brazil", "children": [] } // phone: { "name": "Italy", "children": [] } [/code] Вот часть, которая помещает каждую страну в дочерний массив каждой категории: [code] for(var c =0; c < categories.length;c++){ object.children.push({"name":categories[c],children:[]}); for(var con = 0;con < countries.length;con++){ object.children[c].children.push({"name":countries[con],"children":[]}); } } [/code] Мой подход, вероятно, неправильный, поэтому любые другие предложения по преобразованию данных в эту иерархическую форму также приветствуются. Подробнее здесь: [url]https://stackoverflow.com/questions/28234901/converting-into-a-hierarchical-array-in-javascript[/url]