2016-08-14 4 views
1

Я пытаюсь использовать JQ "нормализовать" JSON, так что с учетом ввода:Использование JQ "нормализовать" JSON

[ 
    [                    
     {"M":6, "C":66, "R":0.1},  
     {"M":6, "C":81, "R":0.9} 
    ], 
    [  
     {"M":11, "C":94, "R":0.8},  
     {"M":11, "C":55, "R":0.46}  
    ] 
    , 
    ... 
]                   

вывод должен быть:

[ 
    { 
     "M" : 6, 
     "X" : [{"66" : 0.1},{"81": 0.9}] 
    }, 
    { 
     "M" : 11, 
     "X" : [{"94" : 0.8},{"55": 0.46}] 
    }, 
    ... 

] 

я могу извлечь M с map({M: .[0].M, но не уверен, как поступить

ответ

-3
[foreach .[] as $list ({}; 
    { 
    "M": $list[0].M, 
    "X": [foreach $list[] as $item ({}; 
      {"\($item.C)": $item.R} 
     )] 
    } 
)] 
2

Набор X в результате сопоставления по массиву и создание одноэлементного объекта для каждой записи с C в качестве ключа и R в качестве значения.

map({M: .[0].M, X: map({"\(.C)": .R})}) 
0

Поскольку map(f) определяется как [.[]|f], вот расширенная форма решения Santiago «s с некоторыми дополнительными комментариями:

[        # compute result array from 
    .[]       # scaning input array 
| { M: .[0].M    # compute M from the .M of the first element 
    , X: [      # compute X array from 
     .[]     #  scanning each element's objects 
     | {"\(.C)":.R}   #  and constructing new {C:R} objects 
    ]       
    } 
] 
Смежные вопросы