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