繁体   English   中英

将具有相同属性的两个对象的方法合并到每个属性的数组中

[英]Merge methods of two objects with same properties into array for each property

我正在尝试将两个对象的方法合并为一个,以便为父对象中的每个属性生成一个方法数组:

obj1 = {"prop1":"method1","prop2":"method2"}
obj2 = {"prop1":"method3","prop2":"method4"}

期望的输出:

obj1 = {"prop1":["method1","method3"],"prop2":["method2","method4"]}

我正在考虑使用$.extend(obj1,obj2) ,但这只是替换值而不创建数组。 这项任务真的可行吗? 如果是这样,这是怎么做到的?

看看这是否有帮助:

var merge = function(/*...objs*/) {
  return [].reduce.call(arguments, function(acc, x) {
    Object.keys(x).forEach(function(k) {
      acc[k] = (acc[k]||[]).concat([x[k]])
    })
    return acc
  },{})
}

var obj1 = {prop1: "method1", prop2: "method2"}
var obj2 = {prop1: "method3", prop2: "method4"}

console.log(merge(obj1, obj2))
//^
// {prop1: ['method1', 'method3'],
//  prop2: ['method2', 'method4']}

作为比较,您可以使用简单的循环。 以下是打字的更多内容,但对我来说,理解和维护起来要容易得多。 它也是elclanrs的回答速度的两倍 (或Safari的三倍)。

function merge() {
  var result = {},
      obj;

  for (var i=0, iLen=arguments.length; i<iLen; i++) {
    obj = arguments[i];

    for (var p in obj) {

      if (obj.hasOwnProperty(p)) {

        if (!result.hasOwnProperty(p)) {
          result[p] = [];
        }
        result[p].push(obj[p]);
      } 
    }
  } 
  return result;
}

它对于未填充的ES3主机也是安全的,因此应该在每个使用的浏览器中运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM