我需要测试数组中的每个项目是否彼此相同。例如:检查数组中的每个项目在javascript中是否相同
var list = ["l","r","b"]
应该评估为假,因为每个项目不完全相同。在另一方面这样的:因为他们都是相同的
var list = ["b", "b", "b"]
应该评估为真。实现这一目标的最有效(速度/资源)方式是什么?
我需要测试数组中的每个项目是否彼此相同。例如:检查数组中的每个项目在javascript中是否相同
var list = ["l","r","b"]
应该评估为假,因为每个项目不完全相同。在另一方面这样的:因为他们都是相同的
var list = ["b", "b", "b"]
应该评估为真。实现这一目标的最有效(速度/资源)方式是什么?
function identical(array) {
for(var i = 0; i < array.length - 1; i++) {
if(array[i] !== array[i+1]) {
return false;
}
}
return true;
}
在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
确实短路也是如此。
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;
当你第一次遇到它时就返回false。 – Jivings 2012-03-10 13:54:42
是的,我不确定OP是否希望以后使用它,或者在函数中返回。 – 2012-03-10 13:56:16
我的建议是,以消除重复(退房Easiest way to find duplicate values in a JavaScript array),然后检查是否长度== 1这将意味着所有的项目都是一样的。
这可能是O(n^2)(或O(n log n),具体取决于排序算法)。太慢了。 – Dogbert 2012-03-10 13:55:34
我实际上是建议第二个答案(应该指定),即删除重复没有排序。 – 2012-03-10 15:09:48
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;
}
就像我的第一个答案:它会在数组的最后一个元素失败。 – Jivings 2012-03-10 13:59:41
我选择了此解决方案,谢谢。 Pimvdb对array.every有一个非常优雅的解决方案,但是这需要为一个已经很大的文档添加一大块代码(对于非ES5兼容的浏览器支持),因为我只选择了一个.every实例,所以我选择了这个。 – Nick 2012-03-10 17:13:04
您的解决方案对我最有意义。但是,我会将“!=”更改为“!==”,因为您的解决方案在以下数组中返回true [1,1,1,1,1,1,“1”],其中最后一个字符是字符串。 – 2016-03-21 22:34:52
@JoffreyBaratheon你是对的,修好了,谢谢! – Dogbert 2016-03-22 08:17:05