2017-08-29 61 views
5

我對Node.js的下列對象和lodash「查詢」(我只是在終端運行node):值Lodash返回數組,如果路徑有效

var obj = { 
    a: [{ 
    b: [{ 
     c: "apple" 
    }, 
    { 
     d: "not apple" 
    }, 
    { 
     c: "pineapple" 
    }] 
    }] 
}; 

> _.get(obj, "a[0].b[0].c") 
'apple' 

> _.get(obj, "a[0].b[1].c") 
undefined 

> _.get(obj, "a[0].b[2].c") 
'pineapple' 

我的問題是:有沒有辦法返回的路徑被發現有效的值的數組?

例子:

> _.get(obj, "a[].b[].c") 
['apple', 'pineapple'] 
+0

你想要得到的結果陣列的具體路徑,什麼'一[0] .b'?或者您在問題中提供的任何路徑? – alexmac

+3

看看jsonpath。 https://github.com/dchester/jsonpath – Tomalak

+2

感謝@ Tomalak的建議。使用jsonpath這個任務會非常簡單:'jsonpath.query(obj,'$ .a [*]。b [*]。c');' – shaochuancs

回答

1

由於@Tomalak在評論曾建議,該解決方案是使用JSONPath而不是Lodash。

相應Github頁面:https://github.com/dchester/jsonpath

例子:

> var jp = require("jsonpath") 
> var obj = { 
    a: [{ 
    b: [{ 
     c: "apple" 
    }, 
    { 
     d: "not apple" 
    }, 
    { 
     c: "pineapple" 
    }] 
    }] 
}; 

> jp.query(obj, "$.a[*].b[*].c") 
[ 'apple', 'pineapple' ] 
0

我不知道這是否會是最有效的,或者你需要什麼,但 可以使用_.each或_.map如果某些條件下是有效的,以創建一個數組? 可能像

let first = _.map(object, (item) => { 
    //change logic for maybe 
    if(item.b.c) { 
    return item.b.c 
    } 
}) 
//filter out nulls 
let second = _.without(first, null) 
+0

以及如果OP需要結果路徑'a []。b []。c []。d [] .... [k] .m'? –