object/ext/advanced.js

define(['../../iQuery', './base'],  function ($) {

    return $.extend({
        formatJSON:    function () {

            return  JSON.stringify(arguments[0], null, 4)
                .replace(/(\s+"[^"]+":) ([^\s]+)/g, '$1    $2');
        },
        curry:         function (iOrigin) {

            return  function iProxy() {

                return  (arguments.length >= iOrigin.length)  ?
                    iOrigin.apply(this, arguments)  :
                    $.proxy.apply($,  $.merge([iProxy, this], arguments));
            };
        },
        /**
         * 对象交集
         *
         * @author   TechQuery
         *
         * @memberof $
         *
         * @param    {(object|array)} set
         *
         * @returns  {(object|array)} Intersect of parameters
         */
        intersect:    function intersect(set) {

            if (arguments.length < 2)  return set;

            var isArray = $.likeArray( set );

            set = Array.from( arguments );

            set[0] = $.map(set.shift(),  function (value, key) {
                if ( isArray ) {
                    if (set.indexOf.call(set[0], value)  >  -1)
                        return value;
                } else if (
                    (set[0][key] !== undefined)  &&  (set[0][key] === value)
                )
                    return value;
            });

            return  intersect.apply(this, set);
        },
        patch:        function patch(target, source) {

            if (target === source)  return target;

            for (var key in source)  if (source[key] != null) {

                if ($.likeArray( source[key] ))
                    target[key] = $.merge(target[key] || [ ],  source[key]);
                else if (typeof source[key] === 'object')
                    target[key] = patch(target[key] || { },  source[key]);
                else if (! (target[key] != null))
                    target[key] = source[key];
            }

            if (typeof target === 'function')
                patch(target.prototype,  (source || '').prototype);

            return target;
        }
    });
});