javascript通过键名合并两个对象

时间:2019-09-30 18:21:09

标签: javascript jquery

说我有以下两个对象:

var a = {
  "abc": {
    "111": {
       name: "jon"
    }
  },
  "xyz": {
    "222": {
       name: "bill"
    }
  }
}

var b = {
  "xyz": {
    "333": {
       name: "mary"
    }
  }
}

然后,我想创建一个新对象,以按顶级键名将两者合并。所以要得到这样的东西:

var c = {
  "abc": {
    "111": {
       name: "jon"
    }
  },
  "xyz": {
    "222": {
       name: "bill"
    },
    "333": {
       name: "mary"
    }
  }
}

我想可能是您使用.map().each().reduce()做的事情吗? jQuery在这种情况下会有所帮助吗?如果可以,怎么办?

3 个答案:

答案 0 :(得分:4)

您可以简单地使用Object.entries()Array.reduce()

主要思想是遍历两个数组并维护一个映射。

  • 遍历第一个对象并创建其所有属性的映射。

  • 要遍历第二个对象,并对其第二个属性的每个属性检查它是否存在于map中,如果存在,则将其合并,如果不存在,则简单地将其添加。

    < / li>

var a = { "abc": { "111": { name: "jon" } }, "xyz": { "222": { name: "bill" } } }
var b = { "xyz": { "333": { name: "mary" } } };

let result = Object.entries(a).reduce((acc,[key, value]) => (acc[key] = value,acc),{});
Object.entries(b).reduce((acc,[key, value]) => (acc[key] =acc[key] && Object.assign(acc[key], value)|| value,acc),result);

console.log(result);

如果您可以使用现有对象之一,则简单的解决方案可能是:

var a = { "abc": { "111": { name: "jon" } }, "xyz": { "222": { name: "bill" } } }
var b = { "xyz": { "333": { name: "mary" } } };

Object.entries(a).forEach(([key, value])=>{
  b[key] = Object.assign(b[key] || {}, value);
});

console.log(b);

答案 1 :(得分:2)

如果您已经在项目中使用jQuery或Lodash,则可以分别使用$.extend_.merge。当您已经在使用其中一个库时,无需重新设计轮子。

var a = { "abc": { "111": { name: "jon" } }, "xyz": { "222": { name: "bill" } } };
var b = { "xyz": { "333": { name: "mary" } } };

console.log($.extend(true, {}, a, b));
console.log(_.merge({}, a, b));
console.log("a =", a);
console.log("b =", b);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

答案 2 :(得分:0)

您可以使用es6对象解构吗?

var a = {
  "abc": {
    "111": {
       name: "jon"
    }
  },
  "xyz": {
    "222": {
       name: "bill"
    }
  }
}

var b = {
  "xyz": {
    "333": {
       name: "mary"
    }
  }
}

   const c = {abc: a.abc, xyz: [a.xyz, b.xyz]};
    console.log(c);