Modifying jQuery extend to push array items within objects but extend other objects

后端 未结 4 918
太阳男子
太阳男子 2021-01-12 10:55

I\'m thinking this must be a common problem but can\'t seem to find the solution. Using JSON config files to extend a jQuery object that contains objects and arrays.

<
4条回答
  •  孤街浪徒
    2021-01-12 11:30

    I used this solution http://jsfiddle.net/PmuwV/2/ modified from How can I merge properties of two JavaScript objects dynamically? also from JavaScript equivalent of jQuery's extend method

    requires isDOMNode() I just added in a jquery merge (yes I feel dirty too) on arrays in which duplicates will need to be cleaned up post merge. The Jquery source for extend does something very similar but i found this to be more readable.

    function mergeRecursive() {
      // _mergeRecursive does the actual job with two arguments.
      var _mergeRecursive = function (dst, src) {
        if ( isDOMNode(src) || typeof src!=='object' || src===null) {
          return dst; 
        }
    
        for ( var p in src ) {
    
    //my added bit here - [SB]
          if ($.isArray(src[p])){
              $.merge(dst[p],src[p]);
              var dupes = {},
                   singles = [];
              $.each(  dst[p], function(i, el) {
                 if ((dupes[el.name] > -1) &&  (el.name)) {
                     $.extend(singles[dupes[el.name]],el);
                 }else{
                      if (el.name ){
                         dupes[el.name] = i;
                      }
                     singles.push(el);
                 }
             });
             dst[p] = singles;
             }
             continue;        
          }
    //the rest is original - [SB]
    
          if( !src.hasOwnProperty(p) ) continue;
          if ( src[p]===undefined ) continue;
          if ( typeof src[p]!=='object' || src[p]===null) {
            dst[p] = src[p];
          } else if ( typeof dst[p]!=='object' || dst[p]===null ) {
            dst[p] = _mergeRecursive(src[p].constructor===Array ? [] : {}, src[p]); 
          } else {              
            _mergeRecursive(dst[p], src[p]);
          }
        }
        return dst;
      }
    
      // Loop through arguments and merge them into the first argument. 
      var out = arguments[0];
      if ( typeof out!=='object' || out===null) return out;
      for ( var i=1, il=arguments.length; i

提交回复
热议问题