Преобразование хеша в файл формата json [Perl] - PullRequest
0 голосов
/ 22 декабря 2018

Итак, я создал функцию, которая создает хеш %data, который выглядит следующим образом:

{                                                                                                                                     
   '10517' => {                                                                                                                        
                'parent' => '10516', 
                'start' => 1545321095,
                'end' => 1545321098,
                'name' => 'A'                            
              },                                                                                                                       
   '10515' => {                                                                                                                        
                'parent' => '10513', 
                'start' => 1545321091,
                'end' => 1545321095,                    
                'name' => 'B'                           
              },                                                                                                                       
   '10514' => {                                                                                                                        
                'parent' => '10513',  
                'start' => 1545321091,
                'end' => 1545321095,                
                'name' => 'C'                      
              },                                                                                                                       
   '10516' => {                                                                                                                        
                'parent' => '10513',
                'start' => 1545321091,
                'end' => 1545321095,            
                'name' => 'D',                                                                                 
              },                                                                                                                       
   '10511' => {                                                                                                                        
                'parent' => '#####',
                'start' => 1545321090,
                'end' => 1545321099,            
                'name' => 'E'                                             
              },                                                                                                                       
   '10513' => {                                                                                                                        
                'parent' => '10511',
                'start' => 1545321091
                'end' => 1545321097             
                'name' => 'F'
              },                                                                                                                       
   '10518' => {                                                                                                                        
                'parent' => '10516',
                'start' => 1545321094,
                'end' => 1545321098,                    
                'name' => 'G',                                                                                               
              },                                                                                                                       
   '10519' => {                                                                                                                        
                'parent' => '10517',  
                'start' => 1545321096,
                'end' => 1545321097,            
                'name' => 'H',                                                          
              }                                                                                                                        
} 

Я хотел бы создать функцию, которая преобразует данные в следующий вывод:

    {       
        'children' : [
            {
                'id' : 10511,
                'start' : 1545321090,
                'end' : 1545321099,         
                'name' : 'E'    
                'children' : [
                    {
                        'id' : 10513,
                        'start' : 1545321091,
                        'end' : 1545321097,             
                        'name' : 'F'    
                        'children' : [
                            {
                                'id' : 10516,
                                'start' : 1545321091,
                                'end' : 1545321095,         
                                'name' : 'D'            
                            },
                            {
                                'id' : 10514,
                                'start' : 1545321091,
                                'end' : 1545321095,
                                'name' : 'C'                                    
                            },
                            {
                                'id' : 10515,
                                'start' : 1545321091,
                                'end' : 1545321095,             
                                'name' : 'B'                                
                            },
                            {                                                                                                                        
                                'id' : '10517', 
                                'start' : 1545321095,
                                'end' : 1545321098,
                                'name' : 'A'                            
                             }
                        ]
                    }
                ]
            }
        ],
    }

Это не полностью ожидаемые данные (это означает, что мне было лень добавлять другие ids во вложенный формат).

Я хотел бы преобразовать хэш %data, чтобы он содержалдревовидный формат, как показано в примере.Конечная цель состоит в том, чтобы иметь вложенные данные, чтобы каждый родительский элемент хэшировал массив каждого дочернего элемента, и каждый из этих дочерних элементов имеет массив своих собственных дочерних элементов (если они, конечно, есть) и т. Д.

Как мне решить эту проблему?Я ищу самый чистый и самый эффективный способ из всех возможных.Также по возможности без каких-либо дополнительных модулей.

1 Ответ

0 голосов
/ 22 декабря 2018

Просто поместите дочерние элементы в дочерний массив родительского элемента:

use strict;
use warnings;
use Data::Dumper;
my $data =
    {
     '10517' => {
                 'parent' => '10516',
                 'start' => 1545321095,
                 'end' => 1545321098,
                 'name' => 'A'
             },
     '10515' => {
                 'parent' => '10513',
                 'start' => 1545321091,
                 'end' => 1545321095,
                 'name' => 'B'
             },
     '10514' => {
                 'parent' => '10513',
                 'start' => 1545321091,
                 'end' => 1545321095,
                 'name' => 'C'
             },
     '10516' => {
                 'parent' => '10513',
                 'start' => 1545321091,
                 'end' => 1545321095,
                 'name' => 'D',
             },
     '10511' => {
                 'parent' => '#####',
                 'start' => 1545321090,
                 'end' => 1545321099,
                 'name' => 'E'
             },
     '10513' => {
                 'parent' => '10511',
                 'start' => 1545321091,
                 'end' => 1545321097,
                 'name' => 'F'
             },
     '10518' => {
                 'parent' => '10516',
                 'start' => 1545321094,
                 'end' => 1545321098,
                 'name' => 'G',
             },
     '10519' => {
                 'parent' => '10517',
                 'start' => 1545321096,
                 'end' => 1545321097,
                 'name' => 'H',
             }
 };
my $root = [];
for my $id (keys %$data) {
    my $entry = $data->{$id};
    $entry->{id} = $id;
    my $parent = $data->{$entry->{parent}};
    unless ($parent){
        push @$root, $entry
    }
    else{
        push @{$parent->{children}},$entry;
    }
}
print Dumper $root;

. См.

perldoc perldsc 

для ознакомления с вложенными структурами данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...