Javascript 将JS对象中的所有属性返回到";“空的”;状态

Javascript 将JS对象中的所有属性返回到";“空的”;状态,javascript,object,truncate,Javascript,Object,Truncate,我想知道像jQuery这样的框架中是否有一个实用函数来截断JS对象(有不止一个可能的结果,不确定什么是最有用的): 如果没有,有没有比递归迭代所有属性、检查类型以及在必要时删除/重置更聪明的解决方案?您可能正在寻找省略,部分 省略。省略(对象,*键)返回对象的副本,过滤到 省略黑名单中的键(或键数组)。或者接受 指示要忽略哪些键的谓词 _.omit({name:'moe',年龄:50,userid:'moe1'},'userid'); =>{姓名:'moe',年龄:50} _.omit({nam

我想知道像jQuery这样的框架中是否有一个实用函数来截断JS对象(有不止一个可能的结果,不确定什么是最有用的):


如果没有,有没有比递归迭代所有属性、检查类型以及在必要时删除/重置更聪明的解决方案?

您可能正在寻找省略,部分

省略。省略(对象,*键)返回对象的副本,过滤到 省略黑名单中的键(或键数组)。或者接受 指示要忽略哪些键的谓词

_.omit({name:'moe',年龄:50,userid:'moe1'},'userid'); =>{姓名:'moe',年龄:50} _.omit({name:'moe',age:50,userid:'moe1'},函数(值、键、对象){return}.isNumber(值);}); =>{name:'moe',userid:'moe1'}


为每个属性调用构造函数以创建相同类型的空对象

for (var k in obj) {
    obj[k] = obj[k] && obj[k].constructor();
}
这也会将数字返回到0,布尔值返回到false,日期返回到现在,正则表达式返回到空(但NaN仍然是NaN)

要递归执行此操作,请保留对象值属性,但也将其清空(变体3):

要消除数字(变量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个好主意,但不能用于
未定义的
null
值。非常简洁,谢谢<代码>日期s重置为现在,函数也被截断
NaN
Infinity
被重置为
0
,这是有意义的,因为它们都属于
number
类型。是的,并且由于某些原因,RegExp被重置为
/(?:)/
/
不能用于创建空的RegExp,因为它显然用于单行注释<可以使用code>/()/,但
()
会创建一个捕获组。因此,使用了
/(?:)/
?:
表示非捕获组)。您的变量2不起作用,没有变量
val
,即使在我添加
var val=obj[k]之后,它似乎也不会递归到对象中这似乎解决了另一个问题。
var obj={
    foo:"bar", 
    arr:[1,2,3],
    sub:{b:4,c:5,subsub:{e:6}}
}

obj.clear()//returns {foo:"",arr:[],sub:{}}
for (var k in obj) {
    obj[k] = obj[k] && obj[k].constructor();
}
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();
    }
}
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();
    }
}