2017-08-29 43 views
5

Mam następujący obiekt i lodash „zapytań” w node.js (jestem po prostu działa node w terminalu):Lodash return array wartości, jeśli ścieżka jest poprawna

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' 

Moje pytanie brzmi: czy istnieje sposób na zwrócenie tablicy wartości, w której ścieżka została uznana za poprawną?

Przykład:

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

Chcesz dostać tablicę wyników dla określonej ścieżki, coś 'a [0] .b'? Lub dowolną ścieżkę, o której mowa w pytaniu? – alexmac

+3

Spójrz na jsonpath. https://github.com/dchester/jsonpath – Tomalak

+2

Dzięki @ Tomalak's advice. Zadanie to byłoby całkiem proste przy użyciu jsonpath: 'jsonpath.query (obj, '$ .a [*]. B [*]. C');' – shaochuancs

Odpowiedz

1

Jak @Tomalak zasugerował w komentarzu, rozwiązaniem było użycie JSONPath zamiast Lodash.

Ich strona GitHub: https://github.com/dchester/jsonpath

Przykład:

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

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

nie wiem, czy to będzie najbardziej skuteczny lub co trzeba ale można użyć _.each lub _.map utworzyć tablicę jeśli pewne warunki są ważne? może coś

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

i co, jeśli OP potrzebuje wyniku dla ścieżki 'a []. B []. C []. D [] .... [k] .m'? –