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

How to transform an array into a subset using only 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" }]

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

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

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

Returns:

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

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

  • 您可以通过使用两个转换操作来实现您的需要:第一个删除第一个项目,第二个重命名子字段。
  • slice-按照您的建议预先处理您的对象。
  • 最后,修补库(并在您使用时提交拉取请求!)。无论如何,这可能是一个快速修复,应该不会太费时。