javascript - 在 JavaScript 中合并对象

标签 javascript object

<分区>

我有两个对象,我想合并它们,但它不应该替换对象。

var x = {'one':1, 'two': {'b': 2, 'c': 3}}
var y = {'two': {'b': 4}}

当我合并它们时输出应该是:

{'one':1, 'two': {'b': 4, 'c': 3}}

最佳答案

您可以使用递归方法来更新嵌套对象。

var x = {
  'one': 1,
  'two': {
    'b': 2,
    'c': 3
  }
}
var y = {
  'two': {
    'b': 4
  }
}


function merge(a, b) {
// create new object and copy the properties of first one
  var res = Object.assign({}, a);
  //iterate over the keys of second object
  Object.keys(b).forEach(function(e) {
    // check key is present in first object
    // check type of both value is object(not array) and then
    // recursively call the function
    if (e in res && typeof res[e] == 'object' && typeof res[e] == 'object' && !(Array.isArray(res[e]) || Array.isArray(b[e]))) {
   // recursively call the function and update the value 
   // with the returned ne object
   res[e] = merge(res[e], b[e]);
    } else {
      // otherwise define the preperty directly
      res[e] = b[e];
    }
  });
  return res;
}

var res = merge(x, y);

console.log(res);


更新:如果你想合并数组,那么你需要做这样的事情。

var x = {
  'one': 1,
  'two': {
    'b': [22, 23],
    'c': 3
  }
}
var y = {
  'two': {
    'b': [24]
  }
}


function merge(a, b) {
  var res = Object.assign({}, a);
  Object.keys(b).forEach(function(e) {
    if (e in res && typeof res[e] == 'object' && typeof res[e] == 'object' && !(Array.isArray(res[e]) || Array.isArray(b[e]))) {
      res[e] = merge(res[e], b[e]);
      // in case both values are array 
    } else if (Array.isArray(res[e]) && Array.isArray(b[e])) {
      // push the values in second object
      [].push.apply(res[e], b[e]);
      // or use 
      // res[e] = res[e].concat(b[e]);
    } else {
      res[e] = b[e];
    }
  });
  return res;
}

var res = merge(x, y);

console.log(res);

关于javascript - 在 JavaScript 中合并对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45367918/

相关文章:

javascript - 获取可从所有页面访问的汉堡菜单

javascript - 通过正则表达式分割(孟加拉语)字符串而不使用分隔符,零宽度前向查找不起作用

javascript - 向上或向下排序列表项

python - 以元组形式传递多个参数

c++ - 具有多个参数的对象数组

javascript - Vue.js 导入对象

javascript - Eloquent JavaScript,第二版,第 5 章高阶函数

javascript - 在 Javascript 中引用对象的层次结构

JavaScript 对象的属性未定义

javascript - 使用 .search() 或正则表达式查找 ID 中包含 X 的元素