Certain object functions like pick() and create() Back

_.pick() is used to pick up some specific key-value pairs from an object. For example:

_.pick({
    name: 'moe',
    age: 50,
    userid: 'moe1'
}, 'name', 'age'); /** => {name: 'moe', age: 50} */

_.pick({
    name: 'moe',
    age: 50,
    userid: 'moe1'
}, ['name', 'age']); /** => {name: 'moe', age: 50} */

_.pick({
    name: 'moe',
    age: 50,
    userid: 'moe1'
}, function (value, key, object) {
    return _.isNumber(value);
}); /** => {age: 50} */

As we can see, _.pick() will receive an object as the first parameter, while the second one has three situations: Function, Array or Separative Parameters.

Let's see how underscore handle those three conditions smartly.

_.pick = function(object, oiteratee, context) {
    /** result is the created copy to return */
    var result = {}, obj = object, iteratee, keys;

    /** if object is null then return an empty object */
    if (obj == null) return result;

    /** if the second parameter is a function */
    if (_.isFunction(oiteratee)) {
        keys = _.allKeys(obj);

        /**
         * optimizeCb is to redefine where `this` point to,
         * according to the paramter `context`
         */
        iteratee = optimizeCb(oiteratee, context);
    } else {
        /**
         * the second parameter may be an array or a list of separative keys,
         * so underscore has used _.flatten to convert them all into an array.
         */
        keys = flatten(arguments, false, false, 1);

        /** also create a function for iteration */
        iteratee = function(value, key, obj) { return key in obj; };
        obj = Object(obj);
    }

    for (var i = 0, length = keys.length; i < length; i++) {
        var key = keys[i];
        var value = obj[key];

        /** if the iterative function returns `true`, then push it into the copy */
        if (iteratee(value, key, obj)) result[key] = value;
    }

    return result;
};

As for _.create(), it's always used to create a new object, with given prototype and own properties:

var Person = function() {};

Person.prototype = {
    show: function() {
        console.log(this.name);
    }
};

var me = _.create(Person.prototype, {
    name: 'hanzichi'
});

console.log(me.name); /** => "hanzichi" */
me.show(); /** => "hanzichi" */

The most complicated one of this function is to check whether browsers support ES5:

var Person = function() {};

Person.prototype = {
    show: function() {
        console.log(this.name);
    }
};

var me = null;

if (Object.create) {
    me = Object.create(Person.prototype);
} else {
    var _Person = function() {};
    _Person.prototype = Person.prototype;

    me = new _Person();
}

_.extendOwn(me, { name: 'hanzichi' });

console.log(me.name); /** => "hanzichi" */
me.show(); /** => "hanzichi" */

results matching ""

    No results matching ""