2012-03-10 64 views
7

我需要测试数组中的每个项目是否彼此相同。例如:检查数组中的每个项目在javascript中是否相同

var list = ["l","r","b"]

应该评估为假,因为每个项目不完全相同。在另一方面这样的:因为他们都是相同的

var list = ["b", "b", "b"]

应该评估为真。实现这一目标的最有效(速度/资源)方式是什么?

回答

9
function identical(array) { 
    for(var i = 0; i < array.length - 1; i++) { 
     if(array[i] !== array[i+1]) { 
      return false; 
     } 
    } 
    return true; 
} 
+1

我选择了此解决方案,谢谢。 Pimvdb对array.every有一个非常优雅的解决方案,但是这需要为一个已经很大的文档添加一大块代码(对于非ES5兼容的浏览器支持),因为我只选择了一个.every实例,所以我选择了这个。 – Nick 2012-03-10 17:13:04

+0

您的解决方案对我最有意义。但是,我会将“!=”更改为“!==”,因为您的解决方案在以下数组中返回true [1,1,1,1,1,1,“1”],其中最后一个字符是字符串。 – 2016-03-21 22:34:52

+0

@JoffreyBaratheon你是对的,修好了,谢谢! – Dogbert 2016-03-22 08:17:05

2
function matchList(list) { 
    var listItem = list[0]; 

    for (index in list) { 
    if(list[index] != listItem { 
     return false; 
    } 
    } 

    return true; 
} 
+1

将在所述阵列的最后一个元素失败。 – 2012-03-10 13:52:39

+0

是的,我刚刚注意到了。 – Jivings 2012-03-10 13:53:19

+1

已编辑立即开始工作。 – Jivings 2012-03-10 13:55:13

12

在ES5,你可以这样做:

arr.every(function(v, i, a) { 
    // first item: nothing to compare with (and, single element arrays should return true) 
    // otherwise: compare current value to previous value 
    return i === 0 || v === a[i - 1]; 
}); 

.every确实短路也是如此。

+1

不错,不知道这是否存在,并开始使用这个我自己。只需添加一个指向array.every文档的指针https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every – Shane 2012-03-10 14:10:51

+0

谢谢,这是一个非常优雅的解决方案。为了避免添加array.every代码来支持旧浏览器,我最终选择了Dogberts解决方案 - 但原则上这样做可以很好地工作。 – Nick 2012-03-10 17:15:17

1
var list = ["b", "b", "b"]; 
var checkItem = list[0]; 
var isSame = true; 
for (var i = 0; i < list.length; i++) { 
    if (list[i] != checkItem) { 
    isSame = false; 
    break; 
    } 
} 
return isSame; 
+0

当你第一次遇到它时就返回false。 – Jivings 2012-03-10 13:54:42

+0

是的,我不确定OP是否希望以后使用它,或者在函数中返回。 – 2012-03-10 13:56:16

0

我的建议是,以消除重复(退房Easiest way to find duplicate values in a JavaScript array),然后检查是否长度== 1这将意味着所有的项目都是一样的。

+2

这可能是O(n^2)(或O(n log n),具体取决于排序算法)。太慢了。 – Dogbert 2012-03-10 13:55:34

+0

我实际上是建议第二个答案(应该指定),即删除重复没有排序。 – 2012-03-10 15:09:48

0
function allEqual(list) 
{ 
    if(list.length == 0 || list.length == 1) 
    { 
     return true; 
    } 

    for (index in list) { 
    if(list[index] != list[index+1] { 
     return false; 
    } 
    } 

    return true; 

} 
+1

就像我的第一个答案:它会在数组的最后一个元素失败。 – Jivings 2012-03-10 13:59:41

相关问题