首页 > 解决方案 > 遍历 JSON 对象并生成路径和值

问题描述

我希望有人可以帮助我解决以下问题。

我想遍历一个深度嵌套的 JSON 对象并生成一个包含遍历路径和相应值的字典。

我的对象如下所示:

{
  title: 'Mr.',
  user: {
    address: {
      city: 'Amsterdam'
    },
    name: {
      first: 'MyFirstName',
      last: 'MyLastName'
    }
  }
}

我追求的结果是这样的:

{
  'title': 'Mr.',
  'user.address.city': 'Amsterdam',
  'user.name.first': 'MyFirstName',
  'user.name.last': 'MyLastName'
}

我使用Object.Entries方法遍历键/值对并使用递归生成键数组,但它不能很好地处理更深层次的兄弟姐妹......

我已经看过“使用 JavaScript 遍历 JSON 对象树的所有节点 ”,但它并没有解决我的问题,因为我想生成一个字典,其中遍历的路径是键,最深的节点是值。

我想强调一下,我正在寻找一个没有任何框架或库的原生 JavaScript 解决方案。

目前的结果是:

[
  "user.address.city",
  "user.name.first,name.last",
  "user.occupation.job.description.name,description.title"
]

我的代码:

const obj = {
  title: 'Mr.',
  user: {
    address: {
      city: 'Amsterdam'
    },
    name: {
      first: 'MyFirstName',
      last: 'MyLastName'
    }
  }
};

const isObject = (obj) => Object.prototype.toString.call(obj).indexOf("Object") > -1;

const generateBindingKeys = (key, obj) => {
  //return an array of keybindings, because there can be more siblings in one node
  return Object.keys(obj).map(k => isObject(obj[k]) ? `${key}.${generateBindingKeys(k, obj[k])}` : `${key}.${k}`);
};

// traverse all entries in the new state
Object.entries(obj).forEach(([key, val]) => {
  // generate the binding
  // if there are children we need to recursively traverse through the path and return the keys
  const bindings = isObject(val) ? generateBindingKeys(key, val) : key;
  console.log(bindings);
});

标签: javascript

解决方案


你可以通过创建一个recursive函数来实现。检查下面的片段。

  const object = {
    title: 'Mr.',
    user: {
address: {
  city: 'Amsterdam',
},
name: {
  first: 'MyFirstName',
  last: 'MyLastName',
},
    },
  };
  
  
  function getKeyNames(obj, lastStored, secondObj) {
    Object.keys(obj).forEach((r) => {
      const elem = obj[r];
      const refObj = secondObj;
      const key = lastStored ? `${lastStored}.${r}` : r;
      if (!Array.isArray(elem)) {
        if (typeof elem !== 'object') {
          refObj[key] = elem;
        }
      }
      if (typeof elem === 'object' && (!Array.isArray(elem))) {
        getKeyNames(elem, key, secondObj);
      }
    });
    return secondObj;
  }
  
  function getAllKeys(obj) {
    const secondObj = {};
    const keys = getKeyNames(obj, '', secondObj);
    return keys;
  }
  
  const result = getAllKeys(object);
  console.log(result);

注意:当任何键组成时不起作用[]


推荐阅读