代码之家  ›  专栏  ›  技术社区  ›  Jakub Kopyś

JavaScript/Coffeescript和对象

  •  1
  • Jakub Kopyś  · 技术社区  · 7 年前

    我希望以这种方式“添加/合并”(不知道如何称呼)一些对象:

    obj1 = { 
      a: 1,
      b: 1,
      c: 1
    }
    
    obj2 = { 
      a: 1,
      b: 1
    }
    
    obj1 + obj2 => { a: 2, b: 2, c: 1 }
    

    有没有办法做到这一点?尝试 Object.assign(obj1, obj2 )但它不会像我需要的那样添加属性(它返回 { a: 1, b: 1, c: 1 })

    3 回复  |  直到 7 年前
        1
  •  3
  •   bygrace    7 年前

    没有一种内置的方法可以做到这一点,但您可以枚举一个对象的属性并将其值添加到另一个对象中。

    const a = { a: 1, b: 1, c: 1 };
    const b = { a: 1, b: 1 };
    for(const prop in b) {
      a[prop] = (prop in a ? a[prop] : 0) + b[prop];
    }
    console.log(a);

    这个 prop in a 检查是为了不让我们 NaN 通过添加 undefined 到中的值 b .

    你可以使用 reduce 要合并 n 这样的对象数:

    const a = { a: 1, b: 1, c: 1 };
    const b = { a: 1, b: 1 };
    const c = { a: 1, c: 1 };
    const result = [a, b, c].reduce((p, c) => {
      for(const prop in c) {
        p[prop] = (prop in p ? p[prop] : 0) + c[prop];
      }
      return p;
    }, {});
    console.log(result);

    您没有提到您希望如何处理原型链中的属性。你应该知道 for...in 将枚举原型链中的属性 prop in x 还将检查原型链。如果您只想枚举对象自己的属性,那么可以使用 Object.entries() 获取自己的属性或执行 hasOwnProperty(...) 对于在里面 并取代 x中的支柱 检查如果您没有对模型进行任何原型继承,那么您可能不会在意。

        2
  •  1
  •   Andrés    7 年前

    快速回答:

    let sum = {};
    let keys = new Set(Object.keys(obj1))
    Object.keys(obj2).map(x => keys = keys.add(x))
    
    keys.forEach(x => {
    	let op1 = obj1[x] || 0;
    	let op2 = obj2[x] || 0;
    	sum[x] = op1 + op2;
    })
        3
  •  0
  •   Rick Hitchcock    7 年前

    创建空对象:

    var obj3 = {};
    

    使用 spread operator 要获取两个对象中的所有关键点,然后将它们添加到新对象,如下所示:

    for(var i in {...obj1, ...obj2}) {
      obj3[i] = (obj1[i] || 0) + (obj2[i] || 0);
    }
    

    var obj1 = { 
      a: 1,
      b: 1,
      c: 1
    }
    
    var obj2 = { 
      a: 1,
      b: 2,
      d: 3
    }
    
    var obj3 = {};
    
    for(var i in {...obj1, ...obj2}) {
      obj3[i] = (obj1[i] || 0) + (obj2[i] || 0);
    }
    
    console.log(obj3);