2013-12-14 3 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'"); 

EDIT

Если обычный 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

Чем другой более информативен, sory удаляет ответную метку :) – 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

Смежные вопросы