遍历JSON对象并生成路径和值

时间:2019-08-26 12:09:26

标签: javascript

我希望有人可以在以下方面为我提供帮助。

我想遍历一个深层嵌套的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方法遍历键/值对,并使用递归生成键数组,但是它不能很好地处理更深层次的兄弟姐妹...

我已经看过“ Traverse all the Nodes of a JSON Object Tree with JavaScript ”,但是它并不能解决我的问题,因为我想生成一个字典,其中遍历路径是键,而最深节点是值。

我想强调的是,我正在寻找没有任何框架或库的本机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);
});

2 个答案:

答案 0 :(得分:1)

您可以通过创建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);

  

注意:当任何键包含[]

时不起作用

答案 1 :(得分:0)

只需遍历并将值存储到这样的新对象中即可:

<script>
var jsond = {
    title: 'Mr.',
    user: {
        address: {
            city: 'Amsterdam'
        },
        name: {
            first: 'MyFirstName',
            last: 'MyLastName'
        }
    }
}

var newJson = {};

if(jsond.length!=0){
    jQuery.each(jsond, function (i, val) {
        if(typeof val==="object"){
            jQuery.each(val, function (subi, subval) {


                if(typeof subval==="object"){
                    jQuery.each(subval, function (verysubi, verysubval) {


                        newJson[verysubi] = verysubval;

                    });
                }else{
                    newJson[subi] = subval;
                }

            });
        }else{
            newJson[i] = val;
        }
    });
}

console.log(newJson);
</script>

您也可以通过检查可能的值来分配user.address或任何其他键。

相关问题