深拷贝deepClone:
var obj = {
name: 'David',
list: {
age: 33
}
};
var d = _.deepClone(obj);
console.log(d);
console.log(d.list === obj.list);
_.deepClone = function(obj){
//只支持array和object
if (_.isArray(obj)) {
return _.map(obj, function(elem){
// 递归调用
return _.isArray(elem) || _.isObject(elem) ? _.deepClone(elem) : elem;
});
}
else if (_.isObject(obj)) {
return _.reduce(obj, function(memo, value, key){
memo[key] = _.isArray(value) || _.isObject(value) ? _.deepClone(value) : value;
return memo;
}, {});
}
return obj;
};
白名单:
var d1 = _.pick({name: 'moe', age: 50, userid: 'moe1'}, 'name', 'age');
console.log(d1);
var d2 = _.pick({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object) {
return _.isNumber(value);
});
console.log(d2);
// 白名单
_.pick = function(object, ointeratee, context) {
var interatee, keys, target = {};
if (!_.isObject(object)) {
return object;
}
if (_.isFunction(ointeratee)) {
keys = _.allKeys(object);
interatee = optimizeCb(ointeratee, context);
}
else {
keys = [].slice.call(arguments, 1);
interatee = function(value, key, object) {
return key in object;
};
}
for (var i=0, len = keys.length; i < len; i++) {
var key = keys[i];
if (interatee(object[key], key, object)) {
target[key] = object[key];
}
}
return target;
}
Note:
可以使用key in object来判断 object 上有没有属性key。
var d = {name: 'moe', age: 50, userid: 'moe1'};
console.log('name' in d); // true
console.log('age' in d); // true
console.log('gender' in d);// false