不知道在jQuery这样的框架中有没有一个实用的函数来截断JS对象(可能的结果不止一个,还不知道什么是最有用的)。
{ // original object
foo: "bar",
arr: [1, 2, 3],
sub: {a: 4, b: 5, subsub: {c: 6}} }
{ // truncated, variant 1
foo: "",
arr: [],
sub: {} }
{ // truncated, variant 2
foo: "",
arr: [],
sub: {subsub: {}} }
{ // truncated, variant 3
foo: "",
arr: [],
sub: {a: 0, b: 0, subsub: {c: 0}} }
如果没有,有没有比递归迭代所有属性,检查类型,必要时删除重置更聪明的解决方案?
调用每个属性的构造函数来创建一个相同类型的空对象。
for (var k in obj) {
obj[k] = obj[k] && obj[k].constructor();
}
这也将把数字返回为0,把布尔函数返回为false,把日期返回为now,把regexps返回为空(但NaNs仍然是NaN)。
递归地这样做,保留对象值的属性,但也要清空它们(变体3)。
function truncate(obj) {
for (var k in obj) {
var ctor = obj[k] && obj[k].constructor;
if (ctor === Object) truncate(obj[k]);
else if (ctor) obj[k] = ctor();
}
}
为了消除数字(变体2), 增加一个检查:
function truncate(obj) {
for (var k in obj) {
var ctor = obj[k] && obj[k].constructor;
if (ctor === Object) truncate(obj[k]);
else if (ctor === Number) delete obj[k];
else if (ctor) obj[k] = ctor();
}
}
你可能在寻找OMIT,即是OMIT的一部分 underscore.js.
omit_.省略(object, *keys) 返回一个对象的副本,过滤后省略黑名单中的键(或键数组)。也可以接受一个表示要省略哪些键的谓词。
_.省略({name: 'moe', age: 50, userid: 'moe1'}, 'userid'); => {name: 'moe', age: 50}。 _.省略({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object) { return _.isNumber(value); }); => {name: 'moe', userid: 'moe1'}。
Object.prototype.clear=function(){
for (prop in this){
if (typeof this[prop]==='string') this[prop]='';
else if (this[prop] instanceof Array) this[prop]=[];
else{
this[prop]={}//variant 1
}
}
return this;
}
.
var obj={
foo:"bar",
arr:[1,2,3],
sub:{b:4,c:5,subsub:{e:6}}
}
obj.clear()//returns {foo:"",arr:[],sub:{}}