js-challenges
js-challenges copied to clipboard
对象的合并
var obj1 = {
a: 1,
b: {
c: 2,
d: 3
},
e: 4,
h: {
i: 5
}
}
var obj2 = {
a: 111,
b: {
c: 222,
f: 333
},
g: 444,
h: 666
}
// 实现一个mergeObject(obj1, obj2)方法,得到下面的对象,并转化成JSON输出到#app
var obj = {
a: 111,
b: {
c: 222,
d: 3,
f: 333
},
e: 4,
g: 444,
h: 666
}
//
console.log(JSON.stringify(Object.assign(obj1, obj2)))
//不用Object.assign
function myAssign(obj, ...src) {
for (let i = 0; i < src.length; i++) {
if (src[i] !== null || src[i] !== undefined) {
for (let index in src[i]) {
if (src[i].hasOwnProperty(index)) {
obj[index] = src[i][index];
}
}
}
}
return obj;
}
console.log(JSON.stringify(myAssign(obj1, obj2)))
这个mergeObject方法的主要逻辑是:
- 遍历obj1,将其属性复制到新对象obj
- 遍历obj2,如果key在obj1中不存在,直接复制该key及value到obj
- 如果key在两者中都存在,且value为对象,递归调用mergeObject进行合并
`
function mergeObject(obj1, obj2) {
let obj = {};
for (let key in obj1) {
if (typeof obj1[key] === 'object') {
obj[key] = mergeObject(obj1[key], obj2[key]);
} else {
obj[key] = obj1[key];
}
}
for (let key in obj2) {
if (typeof obj2[key] === 'object') {
obj[key] = mergeObject(obj1[key], obj2[key]);
} else if (!obj.hasOwnProperty(key)) {
obj[key] = obj2[key];
}
}
return obj;}
mergeObject(obj1, obj2);
`
function isObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]';
}
function mergeObject(obj1, obj2) {
let result = {...obj1};
for (let key in obj2) {
if (isObject(obj2[key]) && isObject(result[key])) {
result[key] = mergeObject(result[key], obj2[key]);
} else {
result[key] = obj2[key];
}
}
return result;
}
var obj1 = {
a: 1,
b: { c: 2, d: 3 },
e: 4,
h: { i: 5 }
};
var obj2 = {
a: 111,
b: { c:222, f :333 },
g :444,
h :666
};
var mergedObj = mergeObject(obj1, obj2);
// 将结果转化为JSON并输出到#app元素中
document.querySelector('#app').textContent = JSON.stringify(mergedObj, null, 4);
let mergeObject = function (obj1, obj2) {
if (Object.prototype.toString.call(obj1) !== '[object Object]' || Object.prototype.toString.call(obj2) !== '[object Object]') {
return obj2;
}
let res = {...obj1}
for (let key of Object.keys(obj2)) {
if (!(key in res)) {
res[key] = obj2[key]
} else {
res[key] = mergeObject(res[key], obj2[key])
}
}
return res;
}
function merge(obj1, obj2) {
let obj = {
...obj1
}
for (const key in obj2) {
if (obj[key] && typeof obj[key] === 'object' && typeof obj2[key] === 'object') {
obj[key] = merge(obj[key], obj2[key])
} else {
obj[key] = obj2[key]
}
}
return obj
}