Sunny-117 / js-challenges

✨✨✨ Challenge your JavaScript programming limits step by step

Home Page:https://juejin.cn/column/7244788137410560055

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

对象的合并

Sunny-117 opened this issue · comments

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)))
commented

这个mergeObject方法的主要逻辑是:

  1. 遍历obj1,将其属性复制到新对象obj
  2. 遍历obj2,如果key在obj1中不存在,直接复制该key及value到obj
  3. 如果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
}