递归减去两个JavaScript对象
问题描述:
让我们有一些默认设置的对象:递归减去两个JavaScript对象
var defaults = {
id: '',
x: 0,
y: 0,
width: 20,
height: 20,
styles: {
color: '#ffffff',
background_color: '#000000'
},
points: []
}
然后,我们做我们自己的对象,最初扩展了默认设置,并做了一些变更:
var newObject = {
id: '1', // changed
x: 10, // changed
y: 10, // changed
width: 20,
height: 20,
styles: {
color: '#ffffff',
background_color: '#333333' // changed
},
points: [1, 2, 3]
}
最后,我们需要一个对象,其中只包含从默认设置更改的值,如下所示:
var subtracted = {
id: '1',
x: 10,
y: 10,
styles: {
background_color: '#333333'
},
points: [1, 2, 3]
}
算法需要递归,对象内可以有对象。这是我到目前为止:
function subtract(a, b) {
var r = {};
// For each property of 'b'
// if it's different than the corresponding property of 'a'
// place it in 'r'
for (var key in b) {
if (typeof(b[key]) == 'object') {
if (!a[key]) a[key] = {};
r[key] = subtract(a[key], b[key]);
} else {
if (b[key] != a[key]) {
r[key] = a[key];
}
}
}
return r;
}
但是,递归不适用于数组,所以“点”结果是一个空对象! typeof()将它检测为一个对象,但无法克隆它的属性。
答
您的代码正在工作。虽然有一个我编辑的编辑器也可以递归。
var defaults = {
id: '',
x: 0,
y: 0,
width: 20,
height: 20,
styles: {
color: '#ffffff',
background_color: '#000000'
},
points: []
}
var newObject = {
id: '1', // changed
x: 10, // changed
y: 10, // changed
width: 20,
height: 20,
styles: {
color: '#ffffff',
background_color: '#333333' // changed
},
points: [0, 1, 2] // changed
}
var subtracted = {
id: '1',
x: 10,
y: 10,
styles: {
background_color: '#333333'
}
}
function isSame(a,b) {
if(a.length != b.length) return false;
if(a.filter(function(i) {return a.indexOf(i) < 0;}).length > 0)
return false;
if(b.filter(function(i) {return a.indexOf(i) < 0;}).length > 0)
return false;
return true;
};
function subtract(a, b) {
var r = {};
// For each property of 'b'
// if it's different than the corresponding property of 'a'
// place it in 'r'
for (var key in b) {
if (Array.isArray(b[key])) {
if(!a[key]) a[key] = [];
if(!isSame(a[key],b[key]))
r[key] = a[key];
} else if (typeof(b[key]) == 'object') {
if (!a[key]) a[key] = {};
r[key] = subtract(a[key], b[key]);
} else {
if (b[key] != a[key]) {
r[key] = a[key];
}
}
}
return r;
}
console.log(subtract(newObject, defaults));
哦,这是一个愚蠢的错误:) –
哈哈..它发生:) – Sachin
接受的答案??? – Sachin