我有一个具有各种属性的对象。对象的名称是全局变量,但属性在运行时通过方法更改。某些方法会向对象添加属性。我想添加一个循环遍历此对象的方法,并删除所有null或空属性。我可以通过指定其名称并检查其状态来检查每个属性,但如果我稍后添加属性,我也必须更新此清理方法。如何在不知道属性名称的情况下遍历对象的属性。
感谢您的建议。
答案 0 :(得分:22)
对象的迭代很简单 - for in
循环:
for (var key in object) {
if (object.hasOwnProperty(key)) {
//Now, object[key] is the current value
if (object[key] === null || isEmpty(object[key]))
delete object[key];
}
}
isEmpty
不存在,你必须定义它或用更有意义的东西替换它,我无法理解你的问题中你的意思是什么。
我使用object.hasOwnProperty
因为对象继承了Object.prototype
和其他地方的东西(例如,数组继承自Array.prototype
,继承自Object.prototype
)。所以:
object.toString; //function toString() { [native code] }
但是,object.toString
实际上是指Object.prototype.toString
- 它实际上并不在你的对象中,但当你输入object.toString
时,解释器会发现没有object.toString
,所以它检查原型链直到它找到它。
hasOwnProperty
检查某个对象上是否确实存在某个键:
object.hasOwnProperty("toString"); //false
object.foo = "bar";
object.hasOwnProperty("foo"); //true
对象的下标访问也很简单:
var object = {foo: "bar"};
object.foo; //"bar"
object["foo"]; //"bar"
var key = "foo";
object[key]; //"bar"
请注意,传递给括号的任何内容都会转换为字符串。因此,例如,您可以这样做:
object[Object.prototype.toString] = "magic";
Object.keys(object); //["function toString() { [native code] }"]
如果您想知道,Object.keys是ES5(EcmaScript 5)功能。
答案 1 :(得分:1)
您可以使用a for each循环遍历对象属性。
for ( var i in obj ) {
if ( obj[i] === null ) {
delete obj[i];
}
}
答案 2 :(得分:1)
ES6的实现方式:
arr = [{name: 'jack'}, {name: 'jill'}]
这消除了对象上的所有年龄属性,因此现在:
y = 0.2