2017-03-09 52 views
2

鉴于如何生成嵌套数组,其阵列中的多个对象继续指数

[{ 
    "objects": [{ 
    "key": "value" 
    },{ 
    "key": "value" 
    }] 
}, { 
    "objects": [{ 
    "key": "value" 
    }, { 
    "key": "value" 
    }] 
}] 

如何生成

[{ 
    "objects": [{ 
    "id": 0, 
    "key": "value" 
    },{ 
    "id": 1, 
    "key": "value" 
    }] 
}, { 
    "objects": [{ 
    "id": 2, 
    "key": "value" 
    }, { 
    "id": 3, 
    "key": "value" 
    }] 
}] 

使用JQ?

我试图用这一个,但id s为所有0

jq '[(-1) as $i | .[] | {objects: [.objects[] | {id: ($i + 1 as $i | $i), key}]}]' 
+2

显示您试图先做什么? – Morgoth

+0

@Morgoth新增。但我觉得这可能是根本错误的。 – hgl

+0

这很好,如果是。如果他们看到你正在尝试,人们更愿意提供帮助:) – Morgoth

回答

1

在这里简单的解决方案,关键是要下来把问题分解成简单的部分。这可以通过定义帮助函数addId/1来完成。一旦完成,其余的很简单:

# starting at start, add {id: ID} to each object in the input array 
def addId(start): 
    reduce .[] as $o 
    ([]; 
    length as $l 
    | .[length] = ($o | (.id = start + $l))); 

reduce .[] as $o 
    ({start: -1, answer: []}; 
    (.start + 1) as $next 
    | .answer += [$o | (.objects |= addId($next))] 
    | .start += ($o.objects | length)) 
| .answer 
+0

谢谢,它的工作原理!受到您的解决方案的启发,我想出了一个稍微不同的解决方案。作为另一个答案添加,但我会接受你的答案。 – hgl

+0

谢谢,@ hgl。我没有使用foreach,因为它需要jq 1.5或更高版本,而'reduce'是早期的鸟。 – peak

0

受@peak答案的启发,我想出了这个解决方案。没有太大的区别,只是更短的方式来生成ID和选择foreach而不是reduce,因为涉及中间结果。

def addIdsStartWith($start): 
    [to_entries | map((.value.id = .key + $start) | .value)]; 

[foreach .[] as $set (
    {start: 0}; 
    .set = $set | 
     .start as $start | .set.objects |= addIdsStartWith($start) | 
     .start += ($set.objects | length); 
    .set 
)]