我读到了如何使用递归技术迭代包含对象和数组的多级JSON对象。
让我们说有问题的对象如下
ng-for
使用上面的示例,如果我想将空值或空值更改为有效的字符串,是否正确的方式执行递归技术迭代JSON对象?
<childTwo *ngFor="let childOneData of data.children" [data]="childOneData "></childTwo>
我尝试了以上但没有奏效。不知道我的错误在哪里。如果可能的话,我希望上面的函数能够遍历任何级别的任何JSON对象,并且有/无对象或数组。
我在某处读到使用Underscore / Lo-dash的pick / deepClone(不确定我是否正确)使迭代(通过任何级别,以及JSON对象内的任何内部对象/数组)更容易,这是真正?
由于
答案 0 :(得分:1)
您使用代码的方式正确。只需添加几件事:
- 递归函数应返回值
- Array.isArray(data[key])
不是测试进一步迭代的充分方法,而是使用data[key] !== null && typeof data[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;
}
此外,您的示例data
对象语法无效(缺少逗号)。
答案 1 :(得分:0)
更新了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;
}