2014-08-27 50 views
0

過濾掉鍵我有以下格式從JavaScript對象

{ 
"Node1": [ 
    { 
    "Node2": "node2detail1", 
    "Node3": "node3detail1", 
    "Node4": [ 
     "node4detail1", 
     ] 
    }, 
    { 
    "Node2": "node2detail2", 
    "Node3": "node3detail2", 
    "Node4": [ 
     "node4detail2", 
     ] 
    }, 
    { 
    "Node2": "node2detail3", 
    "Node3": "node3detail3", 
    "Node4": [ 
     "node4detail3", 
     ] 
    } 
]} 

一個JavaScript對象是否可以寫一個jsonpath表達這將導致以下格式的JavaScript對象? 其目的是按鍵過濾。

{ 
"Node1": [ 
    { 
    "Node2": "node2detail1", 
    "Node3": "node3detail1", 
    }, 
    { 
    "Node2": "node2detail2", 
    "Node3": "node3detail2", 
    }, 
    { 
    "Node2": "node2detail3", 
    "Node3": "node3detail3", 
    } 
]} 

回答

5

Jsonpath用於提取值,而不是過濾JavaScript對象。您可以篩選對象:

{Node1: obj.Node1.map(function(o) { return {Node2: o.Node2, Node3: o.Node3}; })} 

如果你喜歡使用下劃線,有_.pick

{Node1: _.map(obj.Node1, function(o) { return _.pick(o, 'Node2', 'Node3'); })} 

如果ES6 /和諧是你的事,定義地圖功能與解構箭頭功能使用簡化的對象文本語法參數和隱式返回值:

{Node1: obj.Node1.map(({Node2, Node3}) => ({Node2, Node3}))} 

破壞性變換:

obj.Node1.forEach(function(o) { delete o.Node4; }) 

如果它適合您的幻想,您可以使用屬性過濾功能JSON.stringify。該數組指定要序列化爲JSON字符串的鍵;其他人被忽略。

JSON.parse(JSON.stringify(obj, ['Node1', 'Node2', 'Node3'])) 

或者你可以指定一個替代品的功能(拍攝鍵和值參數),並通過返回undefinedNode4這意味着可以跳過鍵和它的值:

JSON.parse(JSON.stringify(obj, function(k, v) { if (k !== 'Node4') return v; })) 
+1

這是令人難以置信的徹底。 – 2014-08-28 18:03:07