2013-12-14 45 views
2

比方說,我有一個名爲a一個對象,我怎麼能檢查a在速記多個屬性的具體名單,我認爲它可以使用完成在邏輯運算符,檢查對象在JavaScript的一組屬性

事情是這樣的:

var a = {prop1:{},prop2:{},prop3:{}}; 
if ({1:"prop1",2:"prop2",3:"prop3"} in a) 
    console.log("a has these properties:'prop1, prop2 and prop3'"); 

編輯

如果普通的JavaScript無法提供幫助,jQuery將做什麼,但我更喜歡的javascript

EDIT2

可移植性是特權

回答

8

最簡單的客場是使用傳統的&&

if ("prop1" in a && "prop2" in a && "prop3" in a) 
    console.log("a has these properties:'prop1, prop2 and prop3'"); 

這不是一個'速記',但它並不比你提出的要長。

你也可以把你想要在一個陣列測試屬性名稱和使用every方法:但是

var propertiesToTest = ["prop1", "prop2", "prop3"]; 
if (propertiesToTest.every(function(x) { return x in a; })) 
    console.log("a has these properties:'prop1, prop2 and prop3'"); 

請注意,這是在ECMAScript中5推出,因此它不提供一些較舊的瀏覽器。如果這是一個問題,你可以提供你自己的版本。下面是從MDN實現:

if (!Array.prototype.every) { 
    Array.prototype.every = function(fun /*, thisp */) { 
    'use strict'; 
    var t, len, i, thisp; 

    if (this == null) { 
     throw new TypeError(); 
    } 

    t = Object(this); 
    len = t.length >>> 0; 
    if (typeof fun !== 'function') { 
     throw new TypeError(); 
    } 

    thisp = arguments[1]; 
    for (i = 0; i < len; i++) { 
     if (i in t && !fun.call(thisp, t[i], i, t)) { 
     return false; 
     } 
    } 

    return true; 
    }; 
} 
+0

,我相信它的工作原理,現在,有沒有更好的解決方案? :)如果我們的屬性列表很長,第二個解決方案看起來像一個好鏡頭,讓我們看看 – Benedictus

+0

Ow,那麼傳統方式會太長了,而且每個方法都需要jQuery嗎? – Benedictus

+0

@Benedictus不,這是香草JS。 –

1

像這樣:

var testProps = ['prop1', 'prop2', 'prop3', 'prop4']; 
var num = -1, outA; 
for(var i in a){ 
    if(i === testProps[++num])outA[num] = i; 
} 
console.log('properties in a: '+outA.join(', ')); 
3

使用Array.reduce這樣的:

var testProps = ['prop1', 'prop2', 'prop3']; 
var a = {prop1:{},prop2:{},prop3:{}}; 

var result = testProps.reduce(function(i,j) { return i && j in a }, true); 
console.log(result); 
+0

這看起來不錯,這將工作在IE 8? – Benedictus

+0

如果你填充它 - 它與其他答案相同 – megawac

+0

比另一個更具信息性,索裏刪除答案標記:) – Benedictus

6

這是the underscore.js library真正的亮點。例如,它提供了一個已經多邊填充的every()方法,如對p.s.w.g.的回答的評論中所建議的:http://underscorejs.org/#every

但是有多種方法可以做到這一點;以下,而更詳細的,也可滿足您的需求,並暴露出你更多的強調什麼可以做(如_.keys和_.intersection)

var a = {prop1:{},prop2:{},prop3:{}}; 
var requiredProps = ['prop1', 'prop2', 'prop3']; 
var inBoth = _.intersection(_.keys(a), requiredProps); 
if (inBoth.length === requiredProps.length) { 
    //code 
} 
+0

underscore.js爲你填充填充(爲了使用舊版瀏覽器),它是一個庫,可以使你使用它成爲更好的代碼;例如考慮「功能性Javascript」(以及免費/採樣PDF)書:http://shop.oreilly.com/product/0636920028857.do –

0

我覺得這是很好的嘗試:

/* Create an object class */ 
var obj = function(){ this.attributes = new Array(); } 
obj.prototype.addProp = function(value){ this.attributes.push(new attribute(value)); } 
obj.prototype.hasProp = function(value){ 
    for(var i = 0; i < this.attributes.length; i++){ 
     if(value == this.attributes[i].value) return true; } return false; } 
function attribute(value){ 
    this.value = value; 
} 
/* Testing object has some value*/ 
var ob = new obj(); 
ob.addProp('1'); 
ob.addProp('2'); 
ob.addProp('3'); 
//* check value index 
//alert(ob.attributes[0].value); 
//* check if ob has prop 
alert(ob.hasProp('1')); 

這裏是DEMO