假设我有一个名为a
的对象,我怎么能用速记来检查a
是否有多个属性的特定列表,我认为可以使用 来完成>逻辑运算符,
这样的事情:
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
可移植性是特权
答案 0 :(得分:14)
最简单的方法是使用传统的&&
:
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;
};
}
答案 1 :(得分: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
}
答案 2 :(得分:4)
像这样使用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);
答案 3 :(得分: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(', '));
答案 4 :(得分: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
答案 5 :(得分:0)
稍微更优雅地使用Object.every()
原型函数来包含try-catch
:
try {
const required = ['prop1', 'prop2', 'prop3']
const data = {prop1: 'hello', prop2: 'world', prop3: 'bad'}
if (!required.every( x => x in data )) throw new Error('missing property')
console.log('all properties found')
} catch(err) {
console.log(err.message)
}
``