我想知道在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}} }
如果不是,是否有一个比递归遍历所有属性更聪明的解决方案,检查类型并在必要时删除/重置?
答案 0 :(得分:7)
为每个属性调用构造函数以创建相同类型的空对象。
for (var k in obj) {
obj[k] = obj[k] && obj[k].constructor();
}
这也会将数字返回0,布尔值为false,日期为现在,正则表达式为空(但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();
}
}
答案 1 :(得分:1)
您可能正在寻找OMIT,underscore.js的一部分。
omit_.omit(object,* keys)返回对象的副本,过滤到 省略列入黑名单的键(或键组)。或者接受a 谓词指示要省略哪些键。
_。省略({姓名:' moe',年龄:50,用户ID:' moe1'},' userid'); => {name:' moe',年龄:50} _.omit({name:' moe',age:50,userid:' moe1'},function(value,key,object){return _.isNumber(value);} ); => {name:' moe',userid:' moe1'}
答案 2 :(得分:1)
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:{}}