如何为数组中的嵌套数组中的多个对象生成连续索引

Posted

技术标签:

【中文标题】如何为数组中的嵌套数组中的多个对象生成连续索引【英文标题】:How to generate continuing indices for multiple objects in nested arrays that are in an array 【发布时间】:2017-07-30 12:55:53 【问题描述】:

给定

[
  "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?

我试过用这个,但是ids都是0

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

【问题讨论】:

显示你首先尝试做什么? @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

【讨论】:

谢谢,它有效!受您的解决方案的启发,我想出了一个略有不同的解决方案。作为另一个答案添加,但我会接受你的答案。 谢谢,@hgl。我没有使用 foreach,因为它需要 jq 1.5 或更高版本,而 reduce 是早起的鸟儿。【参考方案2】:

受@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
)]

【讨论】:

以上是关于如何为数组中的嵌套数组中的多个对象生成连续索引的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中,如何为具有多个嵌套数组的 JSON 对象建模?

如何为php中的任何数组提供索引

如何为数组-php中的每个索引添加一个新项目?

如何为数组中的每个对象渲染一个组件?

如何为javascript数组中的每个对象动态添加属性

如何为嵌套的对象数组添加验证