2017-08-29 3 views
5

I持って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' 

私の質問は次のとおりです。パスが有効であると判明した値の配列を返す方法はありますか?

例:私はこれが最も効率的になるか、あなたが必要なものが、 はあなたには、いくつかの条件が有効である場合は、配列を作成するために_.eachまたは_.mapを使用することができるかどうか知らない

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

あなたは、特定のパスの結果の配列、何かが '[0] .b'取得したいですか?質問に記載されているように、または任意のパス? – alexmac

+3

jsonpathを見てください。 https://github.com/dchester/jsonpath – Tomalak

+2

@ Tomalakの助言に感謝します。 '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

? は多分

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'の結果を必要とする場合は? –

関連する問題