这是我的小提琴:DEMO
通过递归迭代,我能够在object2 object3中找到键,并用data2 data3对象中的值替换它的值。
但是,如果它是一个数组,我无法替换它。 (在这种情况下称为'坐标') 怎么能修好?
function update(object, data) {
function getAllKeys(o) {
Object.keys(o).forEach(function(k) {
if (typeof o[k] === 'object') {
return getAllKeys(o[k]);
}
keys[k] = o;
});
}
var keys = Object.create(null);
getAllKeys(object);
Object.keys(data).forEach(function(k) {
if (keys[k] && k in keys[k]) { // check if key for update exist
keys[k][k] = data[k];
}
});
}
答案 0 :(得分:1)
使用以下命令更新getAllKeys
方法:
function getAllKeys(o) {
Object.keys(o).forEach(function(k) {
contains_object = Array.isArray(o[k]) && o[k].some(val=> { return typeof val == "object" && !Array.isArray(val); });
if ((Array.isArray(o[k]) && !contains_object) || typeof o[k] !== 'object') {
keys[k] = o;
} else {
return getAllKeys(o[k]);
}
keys[k] = o;
});
}
注意:!(o[k] instanceof Array)
- http://jsfiddle.net/08pnu7rx/1/
答案 1 :(得分:0)
问题是typeof
还会为数组返回object
。
当对象是数组时,您希望将函数更改为仍然指定键。
function getAllKeys(o) {
Object.keys(o).forEach(function(k) {
if (Array.isArray(o[k]) || typeof o[k] !== 'object') {
keys[k] = o;
} else {
return getAllKeys(o[k]);
}
});
}
注意我交换了逻辑,因此您首先检查数组或其他非对象类型。如果该检查通过,则指定该值。如果没有,你递减。
您应该注意,这根本不是特定于数组的。例如,如果您具有Date
的嵌套属性,则会遇到类似的问题。
答案 2 :(得分:0)
你的代码中的问题是typeof o[k] === 'object'
返回true,即使o [k]是一个数组就是协调的情况,你需要对数组进行否定检查
Object.keys(o).forEach(function(k) {
if (typeof o[k] === 'object'&& !Array.isArray(o[k])) {
return getAllKeys(o[k]);
}
keys[k] = o;
});
<强> Working fiddle 强>
// use Array.isArray or Object.prototype.toString.call
// to differentiate regular objects from arrays
typeof [1, 2, 4] === 'object';