深拷贝deepClone:

    1. var obj = {
    2. name: 'David',
    3. list: {
    4. age: 33
    5. }
    6. };
    7. var d = _.deepClone(obj);
    8. console.log(d);
    9. console.log(d.list === obj.list);
    1. _.deepClone = function(obj){
    2. //只支持array和object
    3. if (_.isArray(obj)) {
    4. return _.map(obj, function(elem){
    5. // 递归调用
    6. return _.isArray(elem) || _.isObject(elem) ? _.deepClone(elem) : elem;
    7. });
    8. }
    9. else if (_.isObject(obj)) {
    10. return _.reduce(obj, function(memo, value, key){
    11. memo[key] = _.isArray(value) || _.isObject(value) ? _.deepClone(value) : value;
    12. return memo;
    13. }, {});
    14. }
    15. return obj;
    16. };

    白名单:

    1. var d1 = _.pick({name: 'moe', age: 50, userid: 'moe1'}, 'name', 'age');
    2. console.log(d1);
    3. var d2 = _.pick({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object) {
    4. return _.isNumber(value);
    5. });
    6. console.log(d2);
    1. // 白名单
    2. _.pick = function(object, ointeratee, context) {
    3. var interatee, keys, target = {};
    4. if (!_.isObject(object)) {
    5. return object;
    6. }
    7. if (_.isFunction(ointeratee)) {
    8. keys = _.allKeys(object);
    9. interatee = optimizeCb(ointeratee, context);
    10. }
    11. else {
    12. keys = [].slice.call(arguments, 1);
    13. interatee = function(value, key, object) {
    14. return key in object;
    15. };
    16. }
    17. for (var i=0, len = keys.length; i < len; i++) {
    18. var key = keys[i];
    19. if (interatee(object[key], key, object)) {
    20. target[key] = object[key];
    21. }
    22. }
    23. return target;
    24. }

    Note:
    可以使用key in object来判断 object 上有没有属性key。

    1. var d = {name: 'moe', age: 50, userid: 'moe1'};
    2. console.log('name' in d); // true
    3. console.log('age' in d); // true
    4. console.log('gender' in d);// false