javascript - 通过保留相同键的所有值来合并 map 的 map (嵌套 map )es6

标签 javascript lodash

我正在尝试合并 2 个具有键和值的映射(又是映射)。

_.merge 适用于 2 个常规 map ,但不适用于 map 的 map 或嵌套 map 。

map1 = {k1: {c1: v1, c2: v2}, k2: {c1: v1, c2: v2}};
map2 = {k1: {c3: v3, c4: v4}, k2: {c3: v3, c4: v4}};

期待

mergedMap = {k1: {c1: v1, c2: v2, c3: v3, c4: v4}, k2: {c1: v1, c2: v2, c3: v3, c4: v4}};

最佳答案

使用_.mergeWith()递归地。

ES6解决方案:

const recursiveMerge = (...args) =>
  _.mergeWith({}, ...args, (objValue, srcValue) => {
    if(typeof srcValue === 'object') {
      return recursiveMerge(objValue, srcValue);
    }
  });

const map1 = {k1: {c1: 'v1', c2: 'v2'}, k2: {c1: 'v1', c2: 'v2'}};
const map2 = {k1: {c3: 'v3', c4: 'v4'}, k2: {c3: 'v3', c4: 'v4'}};

const result = recursiveMerge(map1, map2);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

ES5解决方案:

function recursiveMerge() {
  var args = [].slice.call(arguments, 0);
  var params = [{}].concat(args).concat([
    function(objValue, rcValue) {
      if (typeof srcValue === 'object') {
        return recursiveMerge(objValue, srcValue);
      }
    }]);

  return _.mergeWith.apply(_, params);
}

var map1 = {k1: {c1: 'v1', c2: 'v2'}, k2: {c1: 'v1', c2: 'v2'}};
var map2 = {k1: {c3: 'v3', c4: 'v4'}, k2: {c3: 'v3', c4: 'v4'}};

var result = recursiveMerge(map1, map2);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

关于javascript - 通过保留相同键的所有值来合并 map 的 map (嵌套 map )es6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40136970/

相关文章:

javascript - 动画一个绝对定位的 child 溢出的容器

javascript - 如果动态更改 URL,JQuery TouchTouch 插件不会显示照片

javascript - 将对象数组转换为不同的对象数组 - Javascript/Angular

javascript - 将对象的键分配为该对象内的值

javascript - 使用 lodash 将子属性推送到父对象

javascript:从匿名函数返回值

javascript - Telegram API 返回 HTML 而不是 JSON

javascript - 如何在 for 循环内将新项目附加到同一数组中的同一索引

Javascript,返回匹配的第一个(子)对象

javascript - 合并两个对象并重命名相同的属性