我需要測試數組中的每個項目是否彼此相同。例如:檢查數組中的每個項目在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