如何从 JavaScript 对象的键和值中获取路径

11

我有一个具有深度的JavaScript对象。

我需要知道从该键在对象内的确切路径,例如:"obj1.obj2.data1"

我已经知道关键字是"data1",值为123。

我的JavaScript对象如下所示:

{
    obj1: {
        obj2: {
            data1: 213,
            data2: "1231",
            obj3: {
                data: "milf"
            }
        }
    },
    obj4: {
        description: "toto"
    }
}

我该如何实现这个功能?

这里有一个jsfiddle链接:http://jsfiddle.net/3hvav8xf/8/ 我正在尝试实现getPath。


1
这样做有什么意义? - Ram
这是用于实现变更日志的,如果我们能像今天这样做,那么它将更加容易。 - Dimitri Kopriwa
这是用于MongoDB更新吗? - user405398
@TamilVendhan 不是的,它是用来从一个版本到另一个版本生成JSON变更日志的。 - Dimitri Kopriwa
不要重复造轮子。总会有和你一样聪明的人已经遇到了同样的问题。https://github.com/benjamine/jsondiffpatch - Prinzhorn
1
@Prinzhorn 我正在处理一个已有的系统,需要避免重新实现所有逻辑。我不能实现一个新库,这将需要数月测试。请不要再提供其他替代方案,这个示例只是为了说明我的目标。 - Dimitri Kopriwa
12个回答

0

⚠️ 这段代码虽然没有回答问题,但与之相关:将嵌套对象转换为查询对象,并使用 dot.divided.path 作为键和非对象值;兼容 URlSearchParamsqs。也许对某些人有用。

const isPlainObject = (v) => {
  if (Object.prototype.toString.call(v) !== '[object Object]') return false;
  const prototype = Object.getPrototypeOf(v);
  return prototype === null || prototype === Object.prototype;
};

const objectToQueryObject = (obj, path) => {
  return Object.entries(obj).reduce((acc, [key, value]) => {
    const newPath = path ? `${path}.${key}` : key;
    if (isPlainObject(value)) {
      return {
        ...acc,
        ...objectToQueryObject(value, newPath)
      };
    }
    acc[newPath] = value;
    return acc;
  }, {})
};

const queryObjectRaw = {
  value: {
    field: {
      array: {
        '[*]': {
          field2: {
            eq: 'foo',
            ne: 'bar',
          }
        }
      },
      someOtherProp: { in: [1, 2, 3],
        ne: 'baz',
      }
    },
    someOtherField: {
      gt: 123
    },
  },
  otherValue: {
    eq: 2
  },
};

const result = objectToQueryObject(queryObjectRaw);

console.log('result', result);

const queryString = new URLSearchParams(result).toString();

console.log('queryString', queryString);


-2

我强烈建议您在这个问题上使用lodash

在他们的文档中,这应该会帮助您解决问题

// using "_.where" callback shorthand
_.find(characters, { 'age': 1 });
// →  { 'name': 'pebbles', 'age': 1, 'blocked': false }

1
这不会返回我需要的路径。 - Dimitri Kopriwa
1
你为什么需要路径? - Arko Elsenaar
1
我需要保存原始存储位置的引用。 - Dimitri Kopriwa
1
但是,我的意思是,你想用它做什么?如果它是一个静态路径,你可以手动轻松找到它,如果它是动态的,我不明白保存它的意义。 - Arko Elsenaar
1
它可以是动态的,我刚刚添加了一个 jsfiddle。 - Dimitri Kopriwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接