有没有办法遍历任意Javascript对象,并在其数据端更改它,而不是另一个嵌套对象?
因此,如果给出以下内容,我是否可以记录一个对象,其中' 123'' bar',' die','或'成为' xyz'?
var jso = {
hello:[
{ foo:'bar' },
{ abc: { def:'123' } }
],
world:[
{ ride:['or','die'] }
]
};
function recurse(object) {
if (Object.prototype.toString.call(object) === '[object Array]') {
var l = object.length;
while(l--){
recurse(object[l])
}
} else if(typeof object === 'object') {
for(var key in object) {
recurse(object[key])
}
} else {
object = 'xyz';
}
}
recurse(jso)
console.log(jso)
答案 0 :(得分:3)
object = 'xyz';
这不起作用,因为它只是更改了函数调用的本地object
变量。要实际修改对象,需要分配属性:
function recurse(object) {
if(Object.prototype.toString.call(object) === '[object Array]'){
for (var l = object.length; l--; ) {
if (typeof object[l] == 'object')
recurse(object[l]);
else
object[l] = 'xyz';
}
} else {
for(var key in object) {
if (typeof object[key] == 'object')
recurse(object[key]);
else
object[key] = 'xyz';
}
}
}
或(更好)
function recurse(object) {
if (typeof object !== 'object')
return 'xyz';
if (Object.prototype.toString.call(object) === '[object Array]'){
for (var l = object.length; l--; ) {
object[l] = recurse(object[l]);
}
} else {
for (var key in object) {
object[key] = recurse(object[key])
}
}
return object;
}
答案 1 :(得分:0)
Object.keys
在这些情况下很不错。
function recurse(datum) {
if (Array.isArray(datum)) {
datum.forEach(function (arrayItem, idx) {
datum[idx] = recurse(datum[idx]);
});
return datum;
} else if (typeof datum === 'object') {
Object.keys(datum).forEach(function (key) {
datum[key] = recurse(datum[key]);
});
return datum;
} else {
return 'xyz';
}
}
答案 2 :(得分:0)
简单明了:
function recurse(object) {
Object.keys(object).forEach(function(key) {
if (typeof object[key] == "object") {
recurse(object[key]);
} else {
object[key] = "xyz";
}
});
}