很好的成语过滤掉一个对象的成员(javascript)

我想删除某个对象的某些成员(为了参数,那些以'_'开头的键)。 什么是一个优雅的方式来做到这一点? 天真的方式是:

for (var i in obj) if (i[0] === '_') delete obj[i]; 

但是在迭代期间修改了底层对象。 在节点,至less我想我可以

 Object.keys(obj).forEach(function (i) { if (i[0] === '_') delete obj[i]; }); 

或者每次用笨拙的嵌套循环删除一些东西时重新启动迭代。

有没有更好的解决scheme?

编辑:在刚才的testing中,至less在node.js中,天真的解决scheme似乎工作。 当然是有可能的,因为(需要)安全地实施。 有人知道吗?

你不需要担心。 ECMAScript语言规范 §12.6.4的摘录明确指出(由我强调):

没有指定枚举属性的机制和顺序(第一个algorithm中的步骤6.a,第二个步骤中的步骤7.a)。 被列举的对象的属性可能会在枚举过程中被删除。 如果枚举过程中尚未访问的属性被删除,则不会被访问。 如果在枚举过程中将新属性添加到枚举对象中,则新增属性不保证在活动枚举中被访问。 枚举中不得多次访问属性名称。

为什么不创build一个名称删除像列表

 var l = []; for (var i in obj) if (i[0] === '_') l.push(i); l.forEach(function(v){ delete obj[v]; }); 
 Object.keys(obj).filter(function (v) { return v[0] === "_"; }).forEach(function (v) { delete obj[v]; }); 

这将在循环过程中修改对象;

如果你多次使用这个generics:

 Object.keys(obj).filter(function (v) { //filter the object values/keys by some conditions }).forEach( del.bind(obj) ); function del (v) { delete this[v]; } 

另一种方法是创build一个返回过滤对象的函数。 我更喜欢这个解决scheme,以避免对代码的其他部分持有引用被修改的对象的附加影响。

 function filterObject(obj) { var filtered = new Object(); for (var i in obj) if (i[0] != '_') filtered[i] = obj[i]; return filtered; }