我有一个具有 50 个属性的 js 对象。我想检查除“a1”、“a2”和“a3”之外的所有 47 个是否为空。
myObject = {
a1: 'dont-care'
a2: 'dont-care'
a3: 'dont-care'
a4: 'am i null?'
a5: 'am i null?'
...
a50: 'am i null?'
}
我有一个具有 50 个属性的 js 对象。我想检查除“a1”、“a2”和“a3”之外的所有 47 个是否为空。
myObject = {
a1: 'dont-care'
a2: 'dont-care'
a3: 'dont-care'
a4: 'am i null?'
a5: 'am i null?'
...
a50: 'am i null?'
}
您可以Object.keys()
使用Array.prototype.every()
.
演示:http: //jsfiddle.net/akstE/1/
var result = Object.keys(myObject)
.every(function(key) {
switch (key) {
// Change these to your actual property names
case "a1": case "a2": case "a3":
return true; // assuming you don't need to check them at all
default:
return myObject[key] === null; // `== null` to include `undefined`
}
});
(在旧版浏览器中,这两种方法都需要 shims。)
其他人所说的关于对象属性无序的说法是正确的,所以“前三个”的概念是没有意义的。
因此,您可能需要一个函数,该函数可以传递一个对象和一个属性名称列表,然后检查列表中的属性以外的任何属性是否为null
.
请注意,我已经使用=== null
了所以值必须真的是null
,而不仅仅是undefined
.
function allButThreeNull(obj, names) {
for (var p in obj) {
if (obj.hasOwnProperty(p) && names.indexOf(p) == -1) {
if (obj[p] !== null) return false;
}
}
return true;
}
var obj = {one: 'one', two: 'two', three: 'three', four: null, fiv: null};
alert(allButThreeNull(obj, 'one two three'.split(' '))); // true
请注意,在不符合 ES5 的浏览器(例如 IE 8)中,您将需要Array.prototype.indexOf的shim 。
这个怎么样:
var allButFirstThreeAreNull = true;
for (var i = 4; i <= 50; i++) {
if (myObject['a' + i] !== null) {
allButFirstThreeAreNull = false;
break;
}
}
这里的关键点是在使用括号表示法 ( object[property_expression]
) 时通过一些复杂的表达式来处理属性的能力。而且,当然,如果您发现不等于 null 的属性,则无需检查其他属性;因此使用break
.
现在事实证明,这些属性是动态的。好吧,有一件事情要做:
var i, l, isValid = true, props = Object.keys(myObject);
for (i = 3, l = props.length; i < l; i++) {
if (myObject[ props[i] ] !== null) {
isValid = false;
break;
}
}
...除了您的前三个属性实际上可能不是您所想的。检查这个,例如:
var foo = {
'12': null,
booya: 3
'2': null,
'3': null,
};
记录 Object.keys 将为您提供["2", "3", "12", "booya"]
,将数字属性放在前面(并按数字排序)。