如果路径有效,则Lodash返回值数组

时间:2017-08-29 14:45:43

标签: javascript node.js lodash

我在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']

3 个答案:

答案 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')
[]