4

我有一个具有 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?'
}
4

3 回答 3

5

您可以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。)

于 2013-06-04T00:04:53.567 回答
4

其他人所说的关于对象属性无序的说法是正确的,所以“前三个”的概念是没有意义的。

因此,您可能需要一个函数,该函数可以传递一个对象和一个属性名称列表,然后检查列表中的属性以外的任何属性是否为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 。

于 2013-06-04T00:26:59.623 回答
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"],将数字属性放在前面(并按数字排序)。

于 2013-06-04T00:01:29.390 回答