2016-08-15 4 views
6

Lazy-me задается вопросом, есть ли лучший способ скопировать свойства в одном объекте (источнике) на другой объект (место назначения) только в том случае, если свойства существуют в последнем? Это необязательно использовать Underscore.Копирование свойств из одного объекта в другой с условием

Например,

_.mixin({ 
    assign: function (o, destination, source) { 
     for (var property in source) { 
      if (destination.hasOwnProperty(property)) { 
       destination[property] = source[property]; 
      } 
     } 
     return destination; 
    } 
}); 

console.log(_().assign({ a: 1, b: 2, d: 3 }, { a: 4, c: 5 })) // a: 4, b: 2, d: 3 

ответ

3

Один ленивый вариант:

_.extend(a, _.pick(b, _.keys(a))); 

_.pick фильтрует источник объект, используя .keys из назначения объекта и результат используется для расширения destinati на объект.

Если вы не хотите изменять исходные объекты, просто передайте пустой объект функции _.extend.

_.extend({}, a, _.pick(b, _.keys(a))); 
+1

Ха-ха, короче, но безобразно. – Mikey

4

Использование Object.assign(obj1, obj2); (если свойства существуют в последнем), который является родным в ES6 (нет underscore.js не требуется).

Метод Object.assign() используется для копирования значения всех перечислимых собственных свойств из одного или нескольких объектов источника к целевому объекту . Он вернет целевой объект. More info here.

Пример:

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

 
var obj = Object.assign(o1, o2, o3); 
 
console.log(obj);

В качестве альтернативы используют undescore.js

_.extend(destination, *sources)

или

_.extendOwn(destination, *sources)

Detailated информацию можно найти здесь: http://underscorejs.org/#extend

+2

«... только если свойства существуют в последнем». – undefined

+0

@ Vohuman спасибо за ваш комментарий Я отредактировал заметку в своем ответе для справки. – GibboK

Смежные вопросы