如何仅使用jsonpath将数组转换为子集?

时间:2015-06-03 12:55:23

标签: arrays json jsonpath

我想使用jsonpath将包含3个元素的数组转换为2个元素。

鉴于此对象:

var _base = {
    myArray: [{ item: 1, value: "first" }, { item: 2, value: "second" }, { item: 3, value: "third" }]
}

我想使用jsonpath-object transform将对象转换为:

var _newBase = {
    myArray: [{ newItem: 2, newValue: "second" }, { newItem: 3, newValue: "third" }]
}

我知道我可以通过一个简单的slice调用和一些对象操作来做到这一点,但是我有一些复杂的,可变的对象,我在运行时进行转换,所以jsonpath是必需的。

我可以使用以下内容:

var transform = require('jsonpath-object-transform');
var template = { ["$.myArray", { "newItem": "$..item", "newValue": "$..value" }] }
transform(_base, _template) //emits the below

哪一个发出:

[{ newItem: 1, newValue: "one" }, { newItem: 2, newValue: "second" }, { newItem: 3, newValue: "third" }]

但我真正需要的是没有第一个索引的上述对象(所以只是数组中的最后两个对象)。

1 个答案:

答案 0 :(得分:1)

您可以使用@path syntax忽略第一项:

var _template = {
  foo: ['$.myArray[?(@path !== "$[\'myArray\'][0]")]']
};

返回:

{ foo: [ { item: 2, value: 'second' }, { item: 3, value: 'third' } ] }

但是,jsonpath-object transform目前似乎不支持混合@path和访问{["$.data", {"key": "$.value"}]}中的子字段。 因此,这将为您提供以下选项:

  • 您可以使用两个转换操作来实现所需:第一个修剪第一个项目,第二个重命名子字段。
  • slice - 按照您的建议事先预先设置对象。
  • 最后,修补图书馆(并在你的时候提交拉取请求!)。无论如何,它可能是一个快速修复,不应该太耗时。