2017-08-29 9 views
5

Tôi có đối tượng và lodash "truy vấn" sau trong Node.js (tôi chỉ đơn giản là chạy node trong terminal):Lodash trở lại mảng các giá trị nếu con đường là hợp lệ

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' 

Câu hỏi của tôi là: Có cách nào để trả về một mảng các giá trị mà đường dẫn được tìm thấy là hợp lệ không?

Ví dụ:

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

Bạn có muốn để có được mảng kết quả cho các đường dẫn cụ thể, một cái gì đó 'a [0] .b'? Hoặc bất kỳ con đường nào, như bạn đã cung cấp trong câu hỏi? – alexmac

+3

Nhìn vào jsonpath. https://github.com/dchester/jsonpath – Tomalak

+2

Nhờ lời khuyên của @ Tomalak. Nhiệm vụ này sẽ khá dễ dàng khi sử dụng jsonpath: 'jsonpath.query (obj, '$ .a [*]. B [*]. C'); ' – shaochuancs

Trả lời

1

Như @Tomalak đã gợi ý trong một chú thích, giải pháp là sử dụng JSONPath thay vì Lodash.

trang github của họ: https://github.com/dchester/jsonpath

Ví dụ:

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

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

tôi không biết nếu điều này sẽ là hiệu quả nhất hoặc những gì bạn cần nhưng bạn có thể sử dụng _.each hoặc _.map để tạo ra một mảng nếu một số điều kiện có hiệu lực? có lẽ cái gì đó như

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

và nếu OP cần kết quả cho đường dẫn 'a []. B []. C []. D [] .... [k] .m'? –

Các vấn đề liên quan