如何将对象的所有属性拆分为由下划线分隔的字符串?

时间:2015-10-04 15:11:16

标签: jquery arrays json

我有一个巨大的json对象,其中包含对象和属性,以及更多继续使用的对象和属性。我需要一种递归方式来获取所有属性键并按级别输出

例如:

{
    "references":[
        {"id":"00-0031280","origin":"gsis"},
        {"id":"CAR358797","origin":"elias"},
        {"id":"41265","origin":"nflx"}
    ],
    "team":{
        "name":"Raiders",
        "market":"Oakland",
        "alias":"OAK",
        "id":"1c1cec48-6352-4556-b789-35304c1a6ae1"
    },
    "name": "Name",
    "jersey": "08"
}

我需要以某种方式在这个对象中循环并且逐个返回json对象键的整个深度,所以应该返回这个,每行从for循环输出:

references_0_id
references_0_origin
references_1_id
references_1_origin
references_2_id
references_2_origin
team_name
team_market
team_alias
team_id
name
jersey

到目前为止,我有类似的东西,但它不够好,因为它没有正确循环......

function eachRecursive(obj, aKey)
{
    aKey = aKey === null ? '' : aKey;

    for (var k in obj)
    {
        if (typeof obj[k] == "object" && obj[k] !== null)
        {
            aKey += k + '_';
            eachRecursive(obj[k], aKey);
        }
        else
        {
            if (obj.hasOwnProperty(k))
            {
                $('.output').append($('<p />').text(aKey + k));
            }
            // might not even need this.
            aKey = '';
        }
    }
}

aKey的输出似乎有问题,基本上,aKey + k我认为会给我结果我试图到达这里,但是aKey保持不变,而且没有得到妥善清理。

有人可以帮我这个功能吗?一直试图让输出正常工作一段时间没有运气。

**编辑

这是一个演示问题的jsfiddle:

http://jsfiddle.net/raob9pbd/2/

2 个答案:

答案 0 :(得分:1)

您的问题是,您在循环内不断修改aKey,而在追加_时不会从其初始值开始。您只需更改代码即可解决此问题:

eachRecursive(obj[k], aKey + k + '_');

并删除修改aKey

的两行

请参阅http://jsfiddle.net/alnitak/a8gb0g5L/

答案 1 :(得分:0)

尝试使用$.map()$.isArray()$.isPlainObject()Object.keys()

var res = $.map(data, function(value, key) {
  if ($.isArray(value)) {
    return $.map(value, function(v, k) {
       return Object.keys(v).map(function(n, i) {
         return key + "_" + k + "_" + n
       })
    }); 
  } 

  if ($.isPlainObject(value)) {
       return Object.keys(value).map(function(n, i) {
         return key + "_" + i + "_" + n
    }); 
  } else {
       return key
  }

});

&#13;
&#13;
var data = {
    "references":[
        {"id":"00-0031280","origin":"gsis"},
        {"id":"CAR358797","origin":"elias"},
        {"id":"41265","origin":"nflx"}
    ],
    "team":{
        "name":"Raiders",
        "market":"Oakland",
        "alias":"OAK",
        "id":"1c1cec48-6352-4556-b789-35304c1a6ae1"
    },
    "name": "Name",
    "jersey": "08"
}

var res = $.map(data, function(value, key) {
  if ($.isArray(value)) {
    return $.map(value, function(v, k) {
       return Object.keys(v).map(function(n, i) {
         return key + "_" + k + "_" + n
       })
    }); 
  } 

  if ($.isPlainObject(value)) {
       return Object.keys(value).map(function(n, i) {
         return key + "_" + i + "_" + n
    }); 
  } else {
       return key
  }

});

console.log(res)
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
&#13;
&#13;
&#13;