【问题标题】:Find all the key-value pair and returning the path where the pair is in deep nested objects in JS查找所有键值对并返回该对在JS中深层嵌套对象中的路径
【发布时间】:2022-01-04 13:30:05
【问题描述】:

我正在尝试创建一个必须执行以下操作的函数:

  • 将一个 JavaScript 对象作为第一个参数

  • 对象可以有任何结构和深度

  • 将包含键的字符串作为第二个参数

  • 返回一个映射,其中包含为该键找到的所有值 对象 o 结果映射中的键应是对象中键的路径 其中“/”用作分隔符,地图的根键是对象的名称

结果必须是这样的:

let obj = {
    id: 1,
    b: "value",
    c: 404,
    d: { 
        id: "value", 
        b: { 
            id: 1, 
            b: 2 
        } 
    },
};

myFunction(obj, 'id')
// [ ["" -> 1] ["d" -> "value"] ["d/b" -> 1] ]

我正在做以下事情:

let **findAllByKey** = (obj, keyToFind) =>
  Object.entries(obj).reduce(
    (acc, [key, value]) =>
      key === keyToFind
        ? acc.concat(value)
        : typeof value === "object"
        ? acc.concat(findAllByKey(value, keyToFind))
        : acc,
    []
  );


console.log(findAllByKey(obj, "id"));

但这仅返回值,我无法获取路径:“/d/b”, 它说必须使用地图构造函数( New Map() )完成,但使用地图,我不知道该怎么做。

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    您可以通过检查值来获取条目并进行迭代。

    const
        getPathes = (object, key) => Object
            .entries(object)
            .reduce((r, [k, v]) => {
                if (!v || typeof v !== 'object') return r;
                r.push(...getPathes(v, key).map(([l, v]) => [k + (l && '/') + l, v]));
                return r;
            }, key in object ? [['', object[key]]] : []),
        object = { id: 1, b: "value", c: 404, d: { id: "value", b: { id: 1, b: 2 } } };
    
    console.log(getPathes(object, 'id')); // [["", 1], ["d", "value"], ["d/b" , 1]]

    【讨论】:

    • MAAAAAAN 这个对我有用。非常感谢。最后一个问题,我在将其翻译成 new map() 时遇到问题;
    • 只需使用new Map(getPathes(object, 'id'))
    【解决方案2】:

    您可以使用jsonpath 库。

    示例:

    const jp = require('jsonpath');
    const result = jp.nodes(obj, '$..id');
    

    结果:

    [
      { path: [ '$', 'id' ], value: 1 },
      { path: [ '$', 'd', 'id' ], value: 'value' },
      { path: [ '$', 'd', 'b', 'id' ], value: 1 }
    ]
    

    之后,您将获得具有 pathvalue 属性的对象,并且可以根据需要转换结果。

    【讨论】:

    • 必须是纯JS
    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多