我在Node.js中有以下对象和lodash“查询”(我只是在终端中运行node
):
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 :(得分: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' ]
答案 1 :(得分: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)
答案 2 :(得分:0)
以下功能可能会有所帮助,而无需使用任何其他库。
function getall(input, path = "", accumulator = []) {
path = path.split(".");
const head = path.shift();
if (input && input[head] !== undefined) {
if (!path.length) {
accumulator.push(input[head]);
} else if (Array.isArray(input[head])) {
input[head].forEach(el => {
getall(el, path.join('.'), accumulator);
});
} else {
getall(input[head], path.join('.'), accumulator);
}
}
return accumulator;
}
样品
> getall(obj, 'a.b')
[ [ { c: 'apple' }, { d: 'not apple' }, { c: 'pineapple' } ] ]
> getall(obj, 'a.b.c')
[ 'apple', 'pineapple' ]
> getall(obj, 'a.b.d')
[ 'not apple' ]
> getall(obj, 'a.b.e')
[]