如何连接多个 JavaScript 对象的属性

IT技术 javascript object dictionary associative-array
2021-02-01 22:26:15

我正在寻找“添加”多个 JavaScript 对象(关联数组)的最佳方法。

例如,给定:

a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };

什么是最好的计算方法:

{ "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
6个回答

引入 ECMAscript 6Object.assign()以在 Javascript 中实现这一点。

所述Object.assign()方法被用于所有可枚举自己的属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

关于 Object.assign() 的 MDN 文档

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }

Object.assign许多现代浏览器都支持,但还不是全部。使用像BabelTraceur 这样的转译器来生成向后兼容的 ES5 JavaScript。

4 小时后,这个答案解决了我在 Angular 7 中的问题。感谢答案的简单和准确。
2021-03-20 22:26:15
@Spen 已包含在此问题的答案中。我没有看到在这里复制它有什么好处。
2021-03-23 22:26:15
Object.assign.apply用于合并对象数组的另一种方法是使用扩展运算符:Object.assign( ...objects )
2021-03-25 22:26:15
如果您不知道需要合并多少个对象,因为它们在一个数组中,您可以按如下方式合并它们: Object.assign.apply({}, [{a: 1}, {b: 2}, ....])
2021-04-03 22:26:15
这是我能说的最好的之一。由于现在主要使用 E6,因此 Object.assign 是最佳答案。
2021-04-08 22:26:15

ECMAScript 6 具有扩展语法现在你可以这样做:

const obj1 = { 1: 11, 2: 22 };
const obj2 = { 3: 33, 4: 44 };
const obj3 = { ...obj1, ...obj2 };

console.log(obj3); // {1: 11, 2: 22, 3: 33, 4: 44}

是的,但是如果你有一个对象数组怎么办。使用assign,您可以做Object.assign({}, ...objcs)Object.assign.apply({}, objcs)
2021-03-19 22:26:15
这应该是公认的答案,因为它是最现代的答案。Object.assign现在已经很旧了,不像这个那样可读。
2021-04-05 22:26:15

这应该这样做:

function collect() {
  var ret = {};
  var len = arguments.length;
  for (var i = 0; i < len; i++) {
    for (p in arguments[i]) {
      if (arguments[i].hasOwnProperty(p)) {
        ret[p] = arguments[i][p];
      }
    }
  }
  return ret;
}

let a = { "one" : 1, "two" : 2 };
let b = { "three" : 3 };
let c = { "four" : 4, "five" : 5 };

let d = collect(a, b, c);
console.log(d);

输出:

{
  "one": 1,
  "two": 2,
  "three": 3,
  "four": 4,
  "five": 5
}
写 'for (var p in...' 而不是 'for (p in...' 不是更好吗?
2021-03-12 22:26:15
不,除了在 IE6 上略有不同。访问 length 属性的成本与访问 len 变量的成本相同。
2021-03-22 22:26:15
length每次调用时查找数组的大小吗?我太习惯写作了for (var i = 0, len = array.length; i < len; ++i),以至于我都记不起来为什么我开始这样做了。
2021-03-26 22:26:15
@Juan 我相信你是不正确的,我做了一些测试来下定决心。缓存长度是一个简单的优化神话,多年来已经过时,它使代码(稍微)不太可读。实际上,缓存长度有时会减慢浏览器 (Safari) 的速度。
2021-03-30 22:26:15
对,那是正确的。缓存一次长度是更好的性能。但是,因为参数“数组”的大小不可能非常大,所以在这种情况下并不重要。
2021-04-08 22:26:15

你可以$.extend像这样使用jquery

let a = { "one" : 1, "two" : 2 },
    b = { "three" : 3 },
    c = { "four" : 4, "five" : 5 };

let d = $.extend({}, a, b, c)

console.log(d)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

编辑: d = $.extend({},a,b,c);
2021-03-21 22:26:15
+1 即使您不使用 jQuery 的方法,您也可以使用他们的代码来帮助构建您自己的(也许更具体的)实现。
2021-03-22 22:26:15
@Randal:不使用 jQuery 有很多很好的理由。
2021-04-06 22:26:15

Underscore几乎没有方法可以做到这一点;

1. _.extend(目的地,*来源)

对象中的所有属性复制目标对象,并返回目标对象。

_.extend(a, _.extend(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

或者

_.extend(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.extend(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

2. _.defaults(object, *defaults)

默认对象的填充object未定义的属性,并返回object

_.defaults(a, _.defaults(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

或者

_.defaults(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.defaults(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }