【问题标题】:Get array of all Lodash paths of object获取对象的所有 Lodash 路径的数组
【发布时间】:2019-04-16 04:50:11
【问题描述】:

我试图弄清楚是否有一种简单的方法可以获取对象的所有“路径”(由 Lodash 定义)的列表。

即:

getPaths({ a: 3, b: { c: 4, d: 0 }})

=> 
[
  ['a'],
  ['b', 'c'],
  ['b', 'd']
]

Lodash 中有这样的机制吗?还是一种简单的创建方法?

【问题讨论】:

标签: javascript object lodash


【解决方案1】:

没有开箱即用的方法,但您可以递归地使用_.transform() 来获取路径:

const getPaths = o =>
  _.transform(o, (acc, v, k) => {

    const keys = _.isObject(v) && !_.isEmpty(v) ? 
      _.map(getPaths(v), sk => _.concat(k, ...sk))
      :
      [[k]];
  
    acc.push(...keys);
  }, []);


const result = getPaths({ a: 3, b: { c: 4, d: 0 }, e: {}, f: [{ g: {h: 5}}] });

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

【讨论】:

    【解决方案2】:

    您可以通过减少给定的嵌套路径或采用空占位符[[]] 来仅减少实际键来获取路径,而无需将访问路径存储到实际对象。

    function getPaths(object) {
        return object && typeof object === 'object' && Object.keys(object).reduce((p, k) => 
            (getPaths(object[k]) || [[]]).reduce((r, a) =>
                [...r, [k, ...a]], p), []);
    }
    
    console.log(getPaths({ a: 3, b: { c: 4, d: 0 } }));

    【讨论】:

      【解决方案3】:

      您可以使用递归方法,如下所示。

      const getPaths = (obj, arr = [], res = []) => {
        Object.entries(obj).forEach(([key, value]) => {
          if (typeof value === 'object' && value) getPaths(value, [...arr, key], res)
          else res.push([...arr, key])
        });
        return res;
      }
      
      
      console.log(getPaths({ a: 3, b: { c: 4, d: 0 }}));

      【讨论】:

        【解决方案4】:

        递归函数:

        function getPaths(obj, prefix) {
          let result = Object.keys(obj).map(key => {
            if (typeof obj[key] == "object" && obj[key] != null) {
              return getPaths(obj[key], key);
            } else {
              return prefix ? [prefix, key] : key;
            }
          });
          return result;
        }
        
        console.log(getPaths({ a: 3, b: { c: 4, d: 0 }}));

        【讨论】:

        • 出于好奇,&& obj[key] != null 是干什么用的?在某些情况下obj[key] 可以评估为null 并且也可以是typeof object?
        • 另外,这会产生一个嵌套结构,而不是我正在寻找的平面数组。
        • 因为typeof null == "object".
        • 嗯,很奇怪。另外我一定是累了,我确定我检查过了,呵呵。
        【解决方案5】:

        好的,如果没有包含的方法,这是我的答案:

        function getPaths(obj, prefix = []) {
          return Object.keys(obj).reduce((arr, key) => {
            const path = [...prefix, key];
            const content = typeof obj[key] === 'object' ? getPaths(obj[key], path) : [path];
            return [...arr, ...content];
          }, []);
        }
               
        console.log(getPaths({ a: 3, b: { c: 4, d: 0, e: { f: 9} }}));
        ;

        【讨论】:

          猜你喜欢
          • 2016-10-12
          • 2017-07-30
          • 1970-01-01
          • 1970-01-01
          • 2021-04-27
          • 1970-01-01
          • 2021-10-31
          • 1970-01-01
          • 2013-12-03
          相关资源
          最近更新 更多