检查js对象的属性是否全为空,3除外

时间:2013-06-03 23:59:30

标签: javascript arrays oop enumeration

我有一个包含50个属性的js对象。我想检查是否所有47个都是null,除了" a1"," a2"和" a3"。

myObject = { 
a1: 'dont-care'
a2: 'dont-care'
a3: 'dont-care'
a4: 'am i null?'
a5: 'am i null?'
...
a50: 'am i null?'
}

3 个答案:

答案 0 :(得分:5)

您可以将Object.keys()Array.prototype.every()一起使用。

DEMO: 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`
        }
    });

(在旧版浏览器中需要两种方法的填充程序。)

答案 1 :(得分:4)

其他人所说的对象属性是无序的是完全正确的,所以“前三”的概念毫无意义。

所以你可能想要的是一个可以传递一个对象和一个属性名称列表的函数,然后检查列表中除null以外的任何属性。{/ p>

请注意,我使用了=== 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标准的浏览器中需要shim for Array.prototype.indexOf(例如IE 8)。

答案 2 :(得分:2)

这个怎么样:

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"],将数字属性放在前面(并按数字排序)。