过滤掉JavaScript对象中的键

Ami*_*iri 0 javascript jsonpath

我有一个以下格式的JavaScript对象

{
"Node1": [
    {
    "Node2": "node2detail1",
    "Node3": "node3detail1",
    "Node4": [
        "node4detail1",
        ]
    },
    {
    "Node2": "node2detail2",
    "Node3": "node3detail2",
    "Node4": [
        "node4detail2",
        ]
    },
    {
    "Node2": "node2detail3",
    "Node3": "node3detail3",
    "Node4": [
        "node4detail3",
        ]
    }
]}
Run Code Online (Sandbox Code Playgroud)

是否可以编写一个jsonpath表达式,该表达式将导致以下格式的JavaScript对象?目的是按键过滤.

{
"Node1": [
    {
    "Node2": "node2detail1",
    "Node3": "node3detail1",
    },
    {
    "Node2": "node2detail2",
    "Node3": "node3detail2",
    },
    {
    "Node2": "node2detail3",
    "Node3": "node3detail3",
    }
]}
Run Code Online (Sandbox Code Playgroud)

小智 6

Jsonpath用于提取值,而不是过滤JavaScript对象.您可以使用以下方式过滤对象:

{Node1: obj.Node1.map(function(o) { return {Node2: o.Node2, Node3: o.Node3}; })}
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢使用Underscore,则有_.pick:

{Node1: _.map(obj.Node1, function(o) { return _.pick(o, 'Node2', 'Node3'); })}
Run Code Online (Sandbox Code Playgroud)

如果您喜欢ES6/Harmony,请使用简化的对象文字语法将地图函数定义为具有解构参数和隐式返回值的箭头函数:

{Node1: obj.Node1.map(({Node2, Node3}) => ({Node2, Node3}))}
Run Code Online (Sandbox Code Playgroud)

破坏性转变:

obj.Node1.forEach(function(o) { delete o.Node4; })
Run Code Online (Sandbox Code Playgroud)

如果它适合您的喜好,您可以使用属性过滤功能JSON.stringify.该数组指定要序列化为JSON字符串的键; 其他人被忽略了.

JSON.parse(JSON.stringify(obj, ['Node1', 'Node2', 'Node3']))
Run Code Online (Sandbox Code Playgroud)

或者您可以指定一个replacer函数(获取键和值参数)并Node4通过返回kill undefined来删除该键及其值:

JSON.parse(JSON.stringify(obj, function(k, v) { if (k !== 'Node4') return v; }))
Run Code Online (Sandbox Code Playgroud)

  • 这非常彻底。 (2认同)