【问题标题】:JQ: add the position in the json array to the elementJQ:将json数组中的位置添加到元素中
【发布时间】:2018-10-09 08:38:38
【问题描述】:

我实际上通过 API 接收到一个 json,其中包含多个具有不同信息的数组。其中两个阵列是间接链接的。数组 1 包含一个引用数组 2 中元素的数组位置的元素。 我实际上正在转换该 json 以适应请求的要求并将其移动到数据库中。稍后需要在数据库中链接两个阵列的信息。所以我的想法是在数组2中添加一个带有数组位置的元素。

例子:

原始数组一:

{
  "country": [
    {
      "ContinentCode": "EU",
      "ContinentGroup": 1,
      "CountryCode": "DE",
      "CountryName": "Germany",
      "CurrencyIndex": 1
    },
    {
      "ContinentCode": "AM",
      "ContinentGroup": 2,
      "CountryCode": "CA",
      "CountryName": "Canada",
      "CurrencyIndex": 2
    }
  ]
}

数组原二:

{
  "currency": [
    {
      "CODE": "EUR",
      "Name": "Euro"
    },
    {
      "Code": "CAD",
      "Name": "Canadian Dollar"
    }
  ]
}

新数组思路二:

{
  "currency": [
    {
      "CODE": "EUR",
      "Name": "Euro",
      "Position": 1
    },
    {
      "Code": "CAD",
      "Name": "Canadian Dollar",
      "Position": 2
    }
  ]
}

我在 Windows 环境下使用 jq 1.5。我查看了手册,但发现没有内置功能可以将数组位置添加到元素中。有什么想法吗?

问候 蒂莫

【问题讨论】:

  • 这两个json中没有任何共同的属性。哪个将作为您想要的加入 json 的关键?
  • 嗨,阿米特,除了对数组一中索引位置的引用之外,没有共同属性。货币索引号和位置将匹配为键
  • 我不知道 jq 但我们肯定可以使用循环来做到这一点,其中第二个 json 的索引将作为 json 一个的位置。如果您需要,我可以用 Javascript 举例说明?

标签: arrays json jq


【解决方案1】:

要将数组索引添加到 arr2.json 中的数组元素,您可以使用reduce

jq -f program.jq arr2.json

program.jq 包含的位置:

.currency |= reduce range(0;length) as $i (.; .[$i].Position = 1+$i)

或者,假设您在 Windows 环境中:

jq ".currency |= reduce range(0;length) as $i (.; .[$i].Position = 1+$i)" arr2.json

【讨论】:

  • Hi Peak,感谢您提供的解决方案。我测试了代码并得到了一个错误:jq: error: syntax error, unexpected '(', expecting '$' or '[' or '{' (Windows cmd shell quoting issues?) at , line 1 : .Currency |= reduce range(0;length) as (.; .[].Position = 1+) jq: 1 compile error
  • 1.尝试使用 program.jq。 2. 确保没有错别字。
  • 嗨,Peak,好吧,如果我用它工作的程序文件运行它。有趣的。可能是 $i 是问题所在。我通过 powershell 调用 jq 并在 powershell Windows 上 $i 独立于 " 或 ' 获得另一种颜色。非常感谢您的解决方案。关于 timo
【解决方案2】:

这是您需求的示例代码,请运行代码 sn-p 并检查您的需求

var json1 ="{\"country\": [ { \"ContinentCode\": \"EU\", \"ContinentGroup\": 1, \"CountryCode\": \"DE\", \"CountryName\": \"Germany\", \"CurrencyIndex\" : 1}, { \"ContinentCode\": \"AM\", \"ContinentGroup\": 2, \"CountryCode\": \"CA\", \"CountryName\": \"Canada\", \"CurrencyIndex\" : 2}]}";
var json2 = "{\"currency\": [ { \"Code\": \"EUR\", \"Name\": \"Euro\" }, { \"Code\": \"CAD\", \"Name\": \"Canadian Dollar\" }]}";
        
var jsonParsed1 = JSON.parse(json1);
var jsonParsed2 = JSON.parse(json2);

var json3 = [];
for(var i=0;i<jsonParsed1.country.length;i++){
  var json3Object = {"Code":jsonParsed2.currency[i].Code,"Name":jsonParsed2.currency[i].Name,"Position":i+1};
  json3.push(json3Object);
}
console.log(json3);
告诉我它是否对你有帮助

【讨论】:

  • OP 不要求 JS 解决方案
  • 是的,我知道这是一种可以帮助他的例子
  • 您问他是否想要一个 JS 示例,但他还没有回应。为什么这么急?
  • 嗨,阿米特,感谢您的代码。不推荐 JS 解决方案,但感谢您的时间和投入。关于蒂莫
猜你喜欢
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 2015-06-12
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
相关资源
最近更新 更多