我有三个变量,a
,b
和c
。这些变量中的每一个都具有属性foo
,如果它是Boolean
。
在a
,b
和c
之外,其中只有两个人将foo
属性设置为true
。
找出哪一项设置为false
的最有效方法是什么?
为了把它放到上下文中,我有一个函数,我想根据哪个变量foo
设置为false
来做一些事情,我不知道什么是最好的如何确定false
变量是什么。
E.g。我可以使用if语句手动检查:
function doThings():void
{
if (a.foo == true)
{
if (b.foo == true)
{
True = a;
True2 = b;
False = c;
}
else
{
True = a;
True2 = c;
False = b;
}
}
else
{
True = b;
True2 = c;
False = a;
}
//More things...
}
或者我想到的另一种方法是将我知道foo
设置为true的两个变量作为函数的参数传递,然后执行此操作:
function doThings(para, para2):void
{
if (a != para && a != para2)
{
False = a;
}
else if (b != para && b != para2)
{
False = b;
}
else
{
False = c;
}
//More things...
}
旁注:foo
设置为true的两个在运行时被push
编入数组,所以我无法准确地告诉哪一个是哪个编程,但是我可以通过它们作为函数的参数。
知道了这一点,我也可以使用indexOf
轻松检查数组中的哪一个,但该方法的基本原理仍然保持不变。
这可以这样做,不使用参数:
function doThings():void
{
if (TrueArray.indexOf(a) == -1)
{
False = a;
True = b;
True2 = c;
}
else if (TrueArray.indexOf(b) == -1)
{
False = b;
True = c;
True2 = a;
}
else
{
False = c;
True = a;
True2 = b;
}
//More things...
}
目前看来,第二种方法看起来更吸引人,而且似乎最简单,但我只是想知道是否有更复杂的方法来做到这一点。
感谢阅读。
答案 0 :(得分:1)
如果您只想要数组中的第一项foo
值为false,那么最有效的方法可能是简单的for循环。这也会自动扩展到数组中的任意数量的项目(而不是硬编码为3个项目)
//assumes you have an array of objects called 'myArray'
function getFirstFalseFoo():Object {
//iterate over every item in 'myArray'
for(var i:int = 0, len:int = myArray.length; i < len; i++){
//if the array item's foo value is false, return that object (thus exiting the loop)
if(!myArray[i].foo){
return myArray[i];
}
}
}
var myFalseFoo:Object = getFirstFalseFoo();
//OR, you could pass in objects as parameters to the function like this:
function getFirstFalseFoo(... args):Object {
//iterate over every item passed to the function
for(var i:int = 0, len:int = args.length; i < len; i++){
//if the item has a foo property and it's false, return that object (thus exiting the loop)
if(args[i].hasOwnProperty("foo") && !args[i].foo){
return args[i];
}
}
}
var myFalseFoo:Object = getFirstFalseFoo(a, b, c); //you could pass as many objects as you want
当然有很多方法可以实现这一目标,最“高效”可能取决于很多因素,并且取决于您对效率的定义(计算速度最快,代码量最少,可扩展性最好等)。
另外,AS3(以及许多其他语言)中的最佳实践是变量,函数名称以小写字母开头。最好不要让变量名匹配语言关键字。我建议将变量更改为这些行中的变量,以便于阅读和理解:
var falseObj:Object;
var trueObj:Object;
var true2Obj:Object;
答案 1 :(得分:1)
我说你的第二个选择是正确的方向。我可能会这样实现它:
function findFalseFoo(...objects:Array):Object {
for each (var object:Object in objects) {
if (object.foo == false)
return object;
}
}
function doStuff():void {
var falseFoo:Object = findFalseFoo(a, b, c);
switch (falseFoo) {
case a:
// do stuff
break;
case b:
// do stuff
break;
case c:
// do stuff
break;
}
}
当然,在您发布的每个案例中,您发布的所有内容都在设置False
,True
和True2
属性。在这种情况下,您可以这样做:
function assignTrueFalse(...objects:Array):void {
False = True = True1 = null;
for each (var object:Object in objects) {
if (object.foo) {
if (True == null)
True = object;
else
True2 = object;
} else {
False = object;
}
}
}
assignTrueFalse(a, b, c);