【问题标题】:Lodash return array of values if the path is valid如果路径有效,Lodash 返回值数组
【发布时间】:2017-08-29 14:45:42
【问题描述】:

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

【问题讨论】:

  • 你想得到特定路径的结果数组吗,a[0].b?还是您在问题中提供的任何路径?
  • 查看jsonpath。 github.com/dchester/jsonpath
  • 感谢@Tomalak 的建议。这个任务使用 jsonpath 会很容易:jsonpath.query(obj, '$.a[*].b[*].c');
  • 感谢@Tomalak 和 shaochuancs,我得到了我想要的。如果你们中的一个人将其作为答案提交,我将不胜感激。
  • 自己写答案——你已经有了工作代码,所以你需要做的就是复制它,写一个简短的段落,你就完成了。我会投票,每个人都赢了。 :)

标签: javascript node.js lodash


【解决方案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' ]

【讨论】:

    【解决方案2】:

    我不知道这是否是最有效的或您需要的,但是 如果某些条件有效,您可以使用 _.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)
    

    【讨论】:

      【解决方案3】:

      以下功能可能会有所帮助,而无需使用任何其他库。

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

      【讨论】:

        【解决方案4】:

        如何使用 flatMap 和地图

        _(obj.a).flatMap('b').map('c').compact();

        【讨论】:

          猜你喜欢
          • 2019-07-06
          • 1970-01-01
          • 2015-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多