js - 对象递归合并merge

js - 对象递归合并merge

deepAssign、merge

function isObject(obj) {
  return Object.prototype.toString.call(obj) === '[object Object]'
}
function isArray(arr) {
  return Array.isArray(arr)
}
function merge(target, ...arg) {
  return arg.reduce((acc, cur) => {
    return Object.keys(cur).reduce((subAcc, key) => {
      const srcVal = cur[key]
      if (isObject(srcVal)) {
        subAcc[key] = merge(subAcc[key] ? subAcc[key] : {}, srcVal)
      } else if (isArray(srcVal)) {
        // series: [],下层数组直接赋值
        subAcc[key] = srcVal.map((item, idx) => {
          if (isObject(item)) {
            const curAccVal = subAcc[key] ? subAcc[key] : []
            return merge(curAccVal[idx] ? curAccVal[idx] : {}, item)
          } else {
            return item
          }
        })
      } else {
        subAcc[key] = srcVal
      }
      return subAcc
    }, acc)
  }, target)
}
function consoleStr(target, space = 0) {
  console.log(JSON.stringify(target, null, space))
}
// 数组合并
var arr1 = [1, 2, 3]
var arr2 = [4, 5, 6]
consoleStr(merge([], arr1, arr2)) // [4,5,6]
consoleStr(merge(arr1, arr2)) // [4,5,6] 修改arr1

// 对象数组混合合并
consoleStr(
  merge({}, { q: 1, series: [{ a: 1, b: 2, data: [4] }] }, { a: 2, series: [{ a: 3, b: 4, data: [1, 2, 3] }] })
)
//{ q: 1, series: [ { a: 3, b: 4, data: [1, 2, 3]} ], a: 2 }
posted @ 2022-02-09 08:57  zc-lee  阅读(785)  评论(0编辑  收藏  举报