Конечно, у ES6 + должен быть способ объединить два объекта javascript вместе, что это?

javascript ecmascript-6

69587 просмотра

6 ответа

Я устал от того, что мне постоянно приходится писать такой код:

function shallowExtend(obj1,obj2){
  var key;
  for ( key in obj2 ) {
    if ( obj2.hasOwnProperty(key) === false )  continue;
    obj1[key] = obj2[key]
  }
}

Или, если я не хочу писать код сам, создайте библиотеку, которая уже делает это. Конечно ES6 + приходит на помощь на это даст нам что - то вроде Object.prototype.extend(obj2...)О.Р.Object.extend(obj1,obj2...)

Так ES6 + обеспечивает такую ​​функциональность? Если еще нет, то планируется ли такая функциональность? Если не запланировано, то почему бы и нет?

Автор: balupton Источник Размещён: 07.06.2019 01:44

Ответы (6)


195 плюса

Решение

Вы сможете выполнить поверхностное слияние / расширение / назначение в ES6 с помощью Object.assign:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

Синтаксис:

Object.assign ( цель , источники );

где ... sources представляет исходный объект (ы).

Пример:

var obj1 = {name: 'Daisy', age: 30};
var obj2 = {name: 'Casey'};

Object.assign(obj1, obj2);

console.log(obj1.name === 'Casey' && obj1.age === 30);
// true
Автор: Jack Размещён: 16.09.2014 08:25

136 плюса

Вы можете использовать объект отдыха / распространения для этого:

const merged = {...obj1, ...obj2}

ECMAScript предложение в настоящее время на стадии 3 и включена в Вавилоне, используя заданный этап-3 .

Автор: Thijs Koerselman Размещён: 03.09.2015 09:54

11 плюса

Я знаю, что это немного старая проблема, но самое простое решение в ES2015 / ES6 на самом деле довольно просто, используя Object.assign (),

Надеюсь, это поможет, это также поможет объединению DEEP :

/**
 * Simple is object check.
 * @param item
 * @returns {boolean}
 */
export function isObject(item) {
  return (item && typeof item === 'object' && !Array.isArray(item) && item !== null);
}

/**
 * Deep merge two objects.
 * @param target
 * @param source
 */
export function mergeDeep(target, source) {
  if (isObject(target) && isObject(source)) {
    for (const key in source) {
      if (isObject(source[key])) {
        if (!target[key]) Object.assign(target, { [key]: {} });
        mergeDeep(target[key], source[key]);
      } else {
        Object.assign(target, { [key]: source[key] });
      }
    }
  }
  return target;
}

Пример использования:

mergeDeep(this, { a: { b: { c: 123 } } });
// or
const merged = mergeDeep({a: 1}, { b : { c: { d: { e: 12345}}}});  
console.dir(merged); // { a: 1, b: { c: { d: [Object] } } }
Автор: Salakar Размещён: 12.01.2016 05:29

7 плюса

В Object.mixinнастоящее время обсуждается добавление , чтобы позаботиться о поведении, о котором вы просите. https://mail.mozilla.org/pipermail/es-discuss/2012-December/027037.html

Хотя его пока нет в черновике ES6, похоже, что его очень поддерживают, поэтому я думаю, что он скоро появится в черновиках.

Автор: Nathan Wall Размещён: 14.12.2012 04:50

5 плюса

Возможно, Object.definePropertiesметод ES5 сделает эту работу?

например

var a = {name:'fred'};
var b = {age: {value: 37, writeable: true}};

Object.defineProperties(a, b);

alert(a.age); // 37

Документация по MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties

Автор: RobG Размещён: 13.12.2012 05:15

5 плюса

ES6

Object.assign(o1,o2) ; 
Object.assign({},o1,o2) ; //safe inheritance
var copy=Object.assign({},o1); // clone o1
//------Transform array of objects to one object---
var subjects_assess=[{maths:92},{phy:75},{sport:99}];
Object.assign(...subjects_assess); // {maths:92,phy:75,sport:99}

ES7 или Бабель

{...o1,...o2} // inheritance
 var copy= {...o1};
Автор: Abdennour TOUMI Размещён: 16.08.2016 10:34
Вопросы из категории :
32x32