我需要将某些参数传递给函数,并根据传递给它的参数从数组中提取该函数。这很难解释,所以我会告诉你我想做什么。
function SearchDeck(deck,...){
var tryagain = true;
do{
if(deck[0].property == value){
//do something;
tryagain = false;
}
else{
deck.splice(0,1);
}
}
while(tryagain);
}
有多个套牌需要查看,适当的牌组将被传入。我想总是从牌组的顶部抽出(阵列的索引0)。我需要不断画画,直到找到一张符合我要求的卡片。如果它不匹配,我会拼出0索引。我所追求的是动态的,不同的属性甚至我将使用的运算符。 我将拥有if语句的一些例子......
deck[0].color == "orange"
deck[0].value >= 5
deck[0].value < -4
我可以创建多个函数或者使用基于参数的函数fork,但这似乎不是解决此问题的最佳方法。
答案 0 :(得分:0)
听起来您可能对typeof运算符感兴趣:
if (typeof deck == 'object') { ... }
if (typeof deck[0].color == 'string') { ... }
if (typeof deck[0].value == 'number') { ... }
可替换地:
if (deck[0].hasOwnProperty('color')) { ... }
答案 1 :(得分:0)
如果我正确理解了这一点,您希望if(deck[0].property == value)
的每次调用SearchDeck(...)
的行为都不同吗?
我的建议是传递一个函数:
function SearchDeck(deck, validationFunction, ...){
var tryagain = true;
do{
if(validationFunction(deck[0])){
//do something;
tryagain = false;
}
else{
deck.splice(0,1);
}
}
while(tryagain);
}
然后当您调用代码时,您可以执行以下操作:
SearchDeck(deck, function(firstCard) { return firstCard.color == "orange" }, ...);
SearchDeck(deck, function(firstCard) { return firstCard.value >= 5 }, ...);
SearchDeck(deck, function(firstCard) { return firstCard.value < -4 }, ...);
或者,如果您正在寻找的案例可能会被重复使用,那么制作这些命名函数也可能更清晰:
function validateColor(firstCard) {
return firstCard.color == "orange";
}
function validateHighValue(firstCard) {
return firstCard.value >= 5;
}
function validateLowValue(firstCard) {
return firstCard.value < -4;
}
SearchDeck(deck, validateColor, ...);
SearchDeck(deck, validateHighValue, ...);
SearchDeck(deck, validateLowValue, ...);
答案 2 :(得分:0)
这就是我想出的。你需要将检查方式(“=='oragne'”或“&lt; 3”)作为字符串。
function searchDeck() {
var deck = Array.prototype.slice.call(arguments, 1),
tryagain = true,
string = deck[deck.length - 1];
deck.pop();
while (tryagain) {
if (eval('deck[0].property' + string)) {
//do something;
alert('card found');
tryagain = false;
} else {
deck.splice(0, 1);
}
}
}
希望这是你想要的;)
Here is a working jsfiddle example,当然可能会有一种更优雅的方式,这正是我想出来的。请注意,eval可能很危险,因此如果用户选择测试内容(将字符串推入数组中),您应该小心。