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

Vla*_*lad 93 javascript dictionary associative-array object

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

例如,给定:

a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };
Run Code Online (Sandbox Code Playgroud)

什么是最好的计算方法:

{ "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Run Code Online (Sandbox Code Playgroud)

fil*_*oxo 133

ECMAscript 6引入Object.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 }
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您不知道需要合并多少个对象,因为它们位于数组中,您可以按如下方式合并它们:`Object.assign.apply({},[{a:1},{b:2}, ....])` (5认同)
  • 这是我能说的最好的之一.由于现在主要使用E6,因此Object.assign是最佳答案. (4认同)
  • 使用`Object.assign.apply` 合并对象数组的另一种方法是使用扩展运算符:`Object.assign( ...objects )` (2认同)

小智 34

jQuery有一个很好的方法来做到这一点.

http://api.jquery.com/jQuery.extend/

  • @Randal:不使用jQuery有很多很好的理由. (21认同)
  • 如果你不使用jQuery,你*应该*.:) (4认同)
  • 编辑:`d = $ .extend({},a,b,c);` (3认同)

cle*_*tus 33

这应该这样做:

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);
Run Code Online (Sandbox Code Playgroud)

输入:

{
  "one": 1,
  "two": 2,
  "three": 3,
  "four": 4,
  "five": 5
}
Run Code Online (Sandbox Code Playgroud)

输出:

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);
Run Code Online (Sandbox Code Playgroud)

  • 写'for(var p in ...'而不是'for(p in ...')不是更好吗? (2认同)

val*_*lex 21

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}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,因为它是最现代的答案。`Object.assign` 现在已经很旧了,可读性不如这个。 (2认同)

gih*_*uka 12

Underscore几乎没有办法做到这一点;

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

对象中的所有属性复制到目标对象,然后返回目标对象.

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

要么

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

2. _.defaults(对象,*默认值)

使用默认对象中的值填充对象未定义的属性,并返回该对象.

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

要么

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


Thi*_*tos 6

Shallow-cloning (excluding prototype) or merging of objects is now possible using a shorter syntax than Object.assign().

Spread syntax for object literals was introduced in ECMAScript 2018):

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

const result = {...a, ...b, ...c};
// Object { "one": 1, "two": 2 , "three": 3, "four": 4, "five": 5 }
Run Code Online (Sandbox Code Playgroud)

Spread (...) operator is supported in many modern browsers but not all of them.

So, it is recommend to use a transpiler like Babel to convert ECMAScript 2015+ code into a backwards compatible version of JavaScript in current and older browsers or environments.

This is the equivalent code Babel will generate for you:

"use strict";

var _extends = Object.assign || function(target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i];
    for (var key in source) {
      if (Object.prototype.hasOwnProperty.call(source, key)) {
        target[key] = source[key];
      }
    }
  }
  return target;
};

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

var result = _extends({}, a, b, c);
// Object { "one": 1, "two": 2 , "three": 3, "four": 4, "five": 5 }
Run Code Online (Sandbox Code Playgroud)


hev*_*ev1 5

要合并动态数量的对象,我们可以使用Object.assign扩展语法

const mergeObjs = (...objs) => Object.assign({}, ...objs);
Run Code Online (Sandbox Code Playgroud)

上面的函数接受任意数量的对象,将它们的所有属性合并到一个新对象中,其中后面对象的属性覆盖以前对象的属性。

演示:

const mergeObjs = (...objs) => Object.assign({}, ...objs);
Run Code Online (Sandbox Code Playgroud)

要合并对象数组,可以应用类似的方法。

const mergeArrayOfObjs = arr => Object.assign({}, ...arr);
Run Code Online (Sandbox Code Playgroud)

演示:

const mergeObjs = (...objs) => Object.assign({}, ...objs);
const a = {prop: 1, prop2: '2'},
      b = {prop3: 3, prop4: [1,2,3,4]}
      c = {prop5: 5},
      d = {prop6: true, prop7: -1},
      e = {prop1: 2};
const abcd = mergeObjs(a,b,c,d);
console.log("Merged a,b,c,d:", abcd);
const abd = mergeObjs(a,b,d);
console.log("Merged a,b,d:", abd);
const ae = mergeObjs(a,e);//prop1 from e will overwrite prop1 from a
console.log("Merged a,e:", ae);
Run Code Online (Sandbox Code Playgroud)