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

Jquery 如何将对象的所有属性拆分为以下划线分隔的字符串?,jquery,arrays,json,Jquery,Arrays,Json,我有一个巨大的json对象,包含对象和属性,还有更多的对象和属性。我需要一种递归方法来获取所有属性键,并按级别输出它们 例如: { "references":[ {"id":"00-0031280","origin":"gsis"}, {"id":"CAR358797","origin":"elias"}, {"id":"41265","origin":"nflx"} ], "team":{ "name":"

我有一个巨大的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"
}
我需要以某种方式在这个对象中循环,并以1乘1的方式返回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 = '';
        }
    }
}
每个函数都是草书(obj,aKey)
{
aKey=aKey==null?“”:aKey;
用于(obj中的var k)
{
if(对象的类型[k]=“对象”&&obj[k]!==null)
{
aKey+=k+'';
每种草书(obj[k],aKey);
}
其他的
{
if(对象hasOwnProperty(k))
{
$('.output').append($('

').text(aKey+k)); } //可能根本不需要这个。 aKey=''; } } }

aKey
的输出似乎有问题,基本上,
aKey
+
k
我以为会给出我在这里试图得到的结果,但是
aKey
保持太多,没有被正确清除

有人能帮我做这个功能吗?一段时间以来一直试图让输出正常工作,但运气不佳

**编辑

下面是一个演示问题的JSFIDLE:


您的问题是在循环中不断修改
aKey
,而在追加
\uu
时不从其初始值开始。您只需将代码更改为:

eachRecursive(obj[k], aKey + k + '_');
并删除修改
aKey

请参见尝试利用
$.map()
$.isArray()
$.isplainoObject()
对象.keys()

var数据={
“参考资料”:[
{“id”:“00-0031280”,“来源”:“gsis”},
{“id”:“CAR358797”,“来源”:“elias”},
{“id”:“41265”,“来源”:“nflx”}
],
“团队”:{
“名称”:“袭击者”,
“市场”:“奥克兰”,
“别名”:“橡树”,
“id”:“1c1cec48-6352-4556-b789-35304c1a6ae1”
},
“名称”:“名称”,
“泽西”:“08”
}
var res=$.map(数据、函数(值、键){
如果($.isArray(值)){
返回$.map(值,函数(v,k){
返回Object.keys(v.map)(函数(n,i){
返回键+“”+k+“”+n
})
}); 
} 
如果($.isPlainObject(值)){
返回Object.keys(value).map(函数(n,i){
返回键+“”+i+“”+n
}); 
}否则{
返回键
}
});
console.log(res)

您好,谢谢,但它需要在json对象的所有深度内循环。这看起来只在1个深度上循环。@SolomonClosson不,它是递归的-它会一直向下循环。啊-不过有一个错误-它错误地枚举了数组的
length
属性。好的,你是对的,它一直向下循环,但还需要在
results.push(当前)的位置获取值
正在发生。@SolomonClosson我修改了这个,只是为了演示如何修复您自己的代码,而不是无意中包含数组的
length
属性的原始代码。解决方案需要递归,以便它可以遍历任何深度
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
  }

});