Jquery 用于在JSON对象中循环的递归函数
我阅读了关于如何使用递归技术迭代包含对象和数组的多层JSON对象的内容 假设所讨论的对象如下Jquery 用于在JSON对象中循环的递归函数,jquery,json,Jquery,Json,我阅读了关于如何使用递归技术迭代包含对象和数组的多层JSON对象的内容 假设所讨论的对象如下 { "data":[ { "Name": "Name1", "Id": "Id1", "Prop": { "isProp":"" "isClass":"Yes" } }, {
{
"data":[
{
"Name": "Name1",
"Id": "Id1",
"Prop": {
"isProp":""
"isClass":"Yes"
}
},
{
"Name": "Name2",
"Id": "Id2",
"Prop": {
"isProp":"No"
"isClass":"Yes"
}
},
{
"Name": "Name3",
"Id": "Id3",
"Prop": [
{
"isProp":"Maybe"
"isClass":""
},
{
"isProp":"No"
"isClass": null
},
]
}
]
}
以上面的例子为例,如果我想将空值或null值更改为有效字符串,那么执行递归技术来迭代JSON对象的正确方法是什么
$.ajax(somethingHere).success(function(data){
!(Array.isArray(data)) ? iterateObj(data) : $.each(data, function(){ iterateObj(this) });
});
function iterateObj(data){
for(var key in data){
if (data.hasOwnProperty(key)){
if (!(Array.isArray(data[key]))){
if (!data[key]){
data[key] = "Empty";
}
}
else {
$.each(data, function(){ iterateObj(this) })
}
}
}
}
我尝试了上述方法,但没有成功。不知道我的错在哪里。如果可能的话,我希望上面的函数能够遍历任何级别的JSON对象,其中包含/不包含对象或数组
我在某个地方读到,使用下划线/lodash的pick/deepClone(不确定是否正确)使迭代(通过任何级别,以及JSON对象内部的任何内部对象/数组)变得更容易,这是真的吗
谢谢您使用代码的方法是正确的。只有几件事需要补充:
-递归函数应返回值
-
Array.isArray(data[key])
不是测试进一步迭代的充分方法,请使用data[key]!=null&&typeof数据[key]=='object'
代替
因此,您的函数可能如下所示:
$.ajax(somethingHere).success(function(data){
data = iterateObj(data);
});
function iterateObj(data) {
for(var key in data){
if (data.hasOwnProperty(key)) {
if (data[key] !== null && typeof data[key] === 'object') {
data[key] = iterateObj(data[key]);
}
else {
if ( ! data[key]){
data[key] = "Empty";
}
}
}
}
return data;
}
另外,示例数据对象的语法无效(缺少逗号)。更新了iterateObj()
函数以处理其他数据类型
function iterateObj(dupeObj) {
var retObj = new Object();
if (typeof (dupeObj) == 'object') {
if (typeof (dupeObj.length) == 'number')
var retObj = new Array();
for (var objInd in dupeObj) {
if (dupeObj[objInd] == null)
dupeObj[objInd] = "Empty";
if (typeof (dupeObj[objInd]) == 'object') {
retObj[objInd] = iterateObj(dupeObj[objInd]);
} else if (typeof (dupeObj[objInd]) == 'string') {
retObj[objInd] = dupeObj[objInd];
} else if (typeof (dupeObj[objInd]) == 'number') {
retObj[objInd] = dupeObj[objInd];
} else if (typeof (dupeObj[objInd]) == 'boolean') {
((dupeObj[objInd] == true) ? retObj[objInd] = true : retObj[objInd] = false);
}
}
}
return retObj;
}
尝试在不使用ajax调用的情况下,使用固定的json格式(如图所示)对此进行修改。您可能会想到下划线.js,它允许在不破坏Javascript堆栈的情况下执行任意级别的递归。我不确定是否需要检查其他数据类型(对象和数组除外,可能还有布尔值),由于我只想将任何空数据(empty、NaN、undefined、null、0、false..)更改为“empty”,所以我不太明白您要验证的键是对象还是数组。如果这部分是真的,那么如果被迭代的键实际上是一个数组,它不会跳过迭代吗?数组也是对象,所以它不会跳过。由于null在Javascript中也被视为对象,因此我还要检查变量是否为null。