代码之家  ›  专栏  ›  技术社区  ›  Vlad

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

  •  76
  • Vlad  · 技术社区  · 16 年前

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

    例如,给定:

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

    { "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
    
    12 回复  |  直到 10 年前
        1
  •  190
  •   adiga    6 年前

    介绍了ECMAscript 6 Object.assign() 在Javascript中实现这一点。

    这个 方法用于将所有可枚举自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

    MDN documentation on Object.assign()

    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 is supported in many modern browsers Babel Traceur

        2
  •  47
  •   adiga    6 年前

    spread syntax . 现在你可以做到:

    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}
        3
  •  35
  •   adiga    6 年前

    这应该做到:

    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
    }
    
        4
  •  34
  •   adiga    6 年前

    你可以用jquery的 $.extend 这样地:

    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>
        5
  •  12
  •   gihanchanuka    12 年前

    Underscore 很少有办法做到这一点;

    1. _.extend(destination, *sources)

    来源 将对象转移到 目的地 对象

    _.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)

    填写 未定义 中的属性 使用来自 默认值 对象,并返回 对象

    _.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 }
    
        6
  •  6
  •   Thiago Santos    7 年前

    Object.assign() .

    Spread syntax object literals 于年引进 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 }
    

    中支持 many modern browsers 但不是所有的。

    因此,建议使用 transpiler 喜欢 Babel

    Babel will generate 为你:

    "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 }
    
        7
  •  4
  •   Alsciende    16 年前

    hasOwnProperty .

    function Collect() {
        var o={};
        for(var i=0;i<arguments.length;i++) {
          var arg=arguments[i];
          if(typeof arg != "object") continue;
          for(var p in arg) {
            if(arg.hasOwnProperty(p)) o[p] = arg[p];
          }
        }
        return o;
    }
    
        8
  •  4
  •   Unmitigated    6 年前

    要合并动态数量的对象,可以使用 Object.assign 具有 spread syntax

    const mergeObjs = (...objs) => Object.assign({}, ...objs);
    

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

    演示:

    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);

    const mergeArrayOfObjs = arr => Object.assign({}, ...arr);
    

    const mergeArrayOfObjs = arr => Object.assign({}, ...arr);
    const arr = [
      {a: 1, b: 2},
      {c:1, d:3},
      {abcd: [1,2,3,4], d: 4}
    ];
    const merged = mergeArrayOfObjs(arr);
    console.log(merged);
        9
  •  3
  •   Björn    16 年前
    function Collect(a, b, c) {
        for (property in b)
            a[property] = b[property];
    
        for (property in c)
            a[property] = c[property];
    
        return a;
    }
    

    注意:以前对象中的现有属性将被覆盖。

        10
  •  3
  •   Rip3rs    8 年前

    欧洲标准6++

    问题是增加了各种 不同的

    let obj = {};
    const obj1 = { foo: 'bar' };
    const obj2 = { bar: 'foo' };
    Object.assign(obj, obj1, obj2);
    //output => {foo: 'bar', bar: 'foo'};
    

    假设您有一个具有多个键的对象:

    let obj = {
      foo: { bar: 'foo' },
      bar: { foo: 'bar' }
    }
    

    这就是我找到的解决方案(仍然需要foreach:/)

    let objAll = {};
    
    Object.values(obj).forEach(o => {
      objAll = {...objAll, ...o};
    });
    

    通过这样做,我们可以动态地将所有对象键添加到一个对象中。

    // Output => { bar: 'foo', foo: 'bar' }
    
        11
  •  3
  •   Purkhalo Alex    6 年前

    它很容易使用 ES7扩展运算符 对于对象,在浏览器控制台中

    ({ name: "Alex", ...(true  ? { age: 19 } : { })}) // {name: "Alex", age: 19}
    ({ name: "Alex", ...(false ? { age: 19 } : { })}) // {name: "Alex",        }
    
        12
  •  1
  •   Selay    11 年前

    最快、最有效、更通用的方法可能是这样(您可以合并任意数量的对象,甚至可以复制到第一个对象->分配):

    function object_merge(){
        for (var i=1; i<arguments.length; i++)
           for (var a in arguments[i])
             arguments[0][a] = arguments[i][a];
       return arguments[0];
    }
    

    它还允许您在通过引用传递第一个对象时修改它。 如果您不希望这样,但希望有一个包含所有属性的全新对象,那么可以传递{}作为第一个参数。

    var object1={a:1,b:2};
    var object2={c:3,d:4};
    var object3={d:5,e:6};
    var combined_object=object_merge(object1,object2,object3); 
    

    组合的\u object和object1都包含object1、object2和object3的属性。

    var object1={a:1,b:2};
    var object2={c:3,d:4};
    var object3={d:5,e:6};
    var combined_object=object_merge({},object1,object2,object3); 
    

    点击此处: https://jsfiddle.net/ppwovxey/1/

    注意:JavaScript对象是通过引用传递的。

        13
  •  0
  •   Rodolfo Paranhos    8 年前

    最简单的:扩展运算符

    var obj1 = {a: 1}
    var obj2 = {b: 2}
    var concat = { ...obj1, ...obj2 } // { a: 1, b: 2 }
    
        14
  •  -2
  •   Álvaro González    16 年前
    function collect(a, b, c){
        var d = {};
    
        for(p in a){
            d[p] = a[p];
        }
        for(p in b){
            d[p] = b[p];
        }
        for(p in c){
            d[p] = c[p];
        }
    
        return d;
    }