Расширение вложенного объекта и пропуск неопределенных свойств (в угловой или подчеркивании)


Существует ли какая-либо реализация (или шаблон) о том, как обрабатывать следующие случаи extend? AFAIK нет никакого способа сделать это прямолинейно ни в угловом, ни в подчеркивании, верно?

В противном случае вот моя реализация, но я хотел бы знать, если есть что-то, что уже было сделано, или в любом случае, знать ваши отзывы о моем коде, спасибо!

Http://jsbin.com/welcome/52916/edit

/**    
Extends the target object with the properties in the source object, with the following special handling:

-   it doesn't extend undefined properties, i.e.
        target: { a: 10 }
        source: { a: undefined }
        result: { a: 10 }

-   it does nested extends rather than overwriting sub-objects, i.e.
        target: { b: { i: 'Hi' } }
        source: { b: { j: 'Bye' } }
        result: { b: { i: 'Hi', j: 'Bye' } }

*/
function extend( target, source ) {
  _.each( _.keys( source ), function( k ) {
    if (angular.isDefined( source[k] )) {
      if (angular.isObject( source[k] )) {
        extend( definedOr( target[k], {} ), source[k] );
      }
      else {
        target[k] = source[k];
      }
    }
  });
  return target;
}
2 2

2 ответа:

Да, я думаю, ни _.extend, ни _.defaults не решает вашу проблему, и мой Angular-Fu недостаточно хорош, чтобы там комментировать.

Но, похоже, что jQuery.extend(true, target, source) решает оба ваших варианта использования. true, в вызове метода делает глубокое расширение, в то время как метод extend уже работает с упомянутым вами случаем undefined.

Если вам нужен больший контроль над разрешением конфликтов между исходными и целевыми объектами, я всегда считал, что Object.merge(target, source, deep:boolean, resolve:boolean|function) должен быть более гибким. В случае, если вам интересно, что это метод из библиотеки под названием Sugar.js .

Для полноты картины-сахар.метод js может быть использован, как показано ниже, для вашего конкретного случая использования.

Object.merge(target, source, true, false);

Надеюсь, что это ответ на ваш вопрос.

AngularJS имеет простую функцию расширения:

angular.extend(target, source);

Http://docs.angularjs.org/api/angular.extend

Но вы должны знать, что функция только копирует свойства источника в цель и переопределяет все, что уже существует.

Http://jsfiddle.net/flek/yhuDP/1/