将JS对象中的所有属性返回到“空”状态
我不知道是否有像jQuery这样的截断JS对象的任何框架中有效用函数(有多个可能的结果,不确定什么是最有用的):将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,布尔假,日期到现在,和正则表达式为空(但保留的NaN 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,部分underscore.js。
omit_.omit(对象,*键)返回对象的副本,过滤以 省略黑名单密钥(或多个密钥的阵列)。或者接受指示要省略哪些键的谓词 。 ({name:'moe',年龄:50,userid:'moe1'},'userid'); => {name:'moe',age:50} _.omit({name:'moe',age:50,userid:'moe1'},function(value,key,object){return _.isNumber (value);}); => {名称: 'MOE',用户ID: 'moe1'}
这似乎正在解决一个不同的问题。 – 2014-10-10 18:15:23
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:{}}
+1好主意,但不会用'undefined'和'null'值。 – Oriol 2014-10-10 18:11:24
@Oriol Thx,固定。 – 2014-10-10 18:13:43
不错,简洁,谢谢! '日期'重置为*现在*,函数也被截断。 'NaN'和'Infinity'被重置为'0',这是合理的,因为它们都是'number'类型。 – CoDEmanX 2014-10-10 18:32:19