2013-02-13 59 views
0

我有这个数组(下面),我试图检查它是否有特定的值。按特定顺序检查数组中的多个值

var a = [ true, "lipsum" ]; 

我需要做的,是检查是否a[0]是真实的,如果a[1]是 “lipsum”

我可以检查分开这两个值:

a[0] === true && a[1] === 'lipsum' // true 

...缩短代码有点,我试图做到这一点:

a === [ true, 'lipsum'] // false 

为什么上面的代码示例是错误的,是否有另一种方法来实现我想要做的事情?


我可以这样做:

a.join() === 'true,lipsum' // true 

虽然我不禁觉得有一个更好的办法..?


回答

0

每个阵列是一个独立的对象,所以等于运算符不能用于对它们进行比较。假设你已经对已知参数进行了严格的比较,你使用的第一种方法是最好的。

如果你的论点另一个数组,原数组必须包含,你必须使用一个循环,虽然你可以将它抽象:

Array.prototype.contains = function (array) { 
    for (var x = 0; x < array.length; x++) { 
     if (this.length < x || this[x] !== array[x]) { 
      return false; 
     } 
    } 
    return true; 
} 

http://jsfiddle.net/q5DvG/1/

+0

我跑了jsperf看看有多少'.join'会减慢它的速度,这并不是那么... http://jsperf.com/array-vs-string123456789 ...但我认为它不值得去检查每一个单独。 – Joonas 2013-02-14 00:13:39

+0

@Joonas'.join'会将元素强制转换为字符串,严格的比较将不再有意义。 – 2013-02-14 00:15:30

+0

我不明白它有没有道理? – Joonas 2013-02-14 00:16:29

1

对于只有两个元素,检查简单方式似乎是最好的,但我假设你想做这个维护的原因,因为最终你可能有几个条件来检查(不只是两个)。如果是这样,你可以不喜欢以下,这对于只有两个条件似乎是冗长,但是当你开始增加更多的会比较合理,所以这里的5个条件的例子来检查:

// set a constant somewhere for your truth condition 
var COND = [1, 'a', 5, 'b', 0]; 

// check `a` against the constant array using `every` (Thanks Bergi) 
if (a.every(function(v, i){ return COND[i] === v; })) { 
    // all array elements the same 
} 
+1

使用'every()'而不是过滤和比较长度 – Bergi 2013-02-14 00:08:23

+0

@Bergi学到了一些新东西,谢谢!更新答案。 – mVChr 2013-02-14 00:10:21