2012-03-10 48 views
7

Tôi cần kiểm tra xem mỗi mục trong một mảng có giống nhau hay không. Ví dụ:Kiểm tra xem mỗi mục trong một mảng có giống hệt nhau trong javascript

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

Nên đánh giá là sai, vì mỗi mục không giống nhau. Mặt khác này:

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

nên đánh giá là đúng vì họ là tất cả giống hệt nhau. Điều gì sẽ là cách hiệu quả nhất (về tốc độ/tài nguyên) để đạt được điều này?

Trả lời

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

Tôi đã chọn giải pháp này, cảm ơn. Pimvdb đã có một giải pháp rất thanh lịch với array.every nhưng điều đó đòi hỏi phải thêm một đoạn mã lớn (đối với hỗ trợ trình duyệt không tuân thủ ES5) vào một tài liệu đã lớn cho một phiên bản .every vì vậy tôi đã chọn tham số này. – Nick

+0

Giải pháp của bạn có ý nghĩa nhất đối với tôi. Tuy nhiên, tôi muốn thay đổi "! =" Thành "! ==" vì giải pháp của bạn trả về true trong mảng sau [1,1,1,1,1,1, "1"] trong đó ký tự cuối cùng là một chuỗi . –

+0

@ JoffreyBaratheon bạn nói đúng, cố định, cảm ơn! – Dogbert

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

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

    return true; 
} 
+1

nó sẽ không thành công ở phần tử cuối cùng của mảng. –

+0

Vâng, tôi mới nhận thấy điều đó. – Jivings

+1

Đã chỉnh sửa để hoạt động ngay bây giờ. – Jivings

12

Trong ES5, bạn có thể làm:

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 làm ngắn mạch là tốt.

+1

Tốt, không biết điều này đã tồn tại và sẽ bắt đầu sử dụng bản thân này. Chỉ cần thêm một con trỏ vào tài liệu cho array.every https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every – Shane

+0

Cảm ơn, đó là một giải pháp rất thanh lịch. Tôi đã đi cho Dogberts giải pháp cuối cùng để tránh việc thêm các mảng array.every để hỗ trợ các trình duyệt cũ hơn - nhưng về nguyên tắc này sẽ làm việc độc đáo. – Nick

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

Chỉ cần trả về false khi bạn gặp phải lần đầu tiên. – Jivings

+0

Vâng, tôi đã không chắc chắn nếu OP muốn nó để sử dụng sau này, hoặc trả lại trong một chức năng. –

0

Đề xuất của tôi là xóa các bản sao (xem Easiest way to find duplicate values in a JavaScript array), sau đó kiểm tra xem chiều dài == 1. Điều đó có nghĩa là tất cả các mục đều giống nhau.

+2

Đó sẽ là O (n^2) (hoặc O (n log n) tùy thuộc vào thuật toán sắp xếp). Quá chậm. – Dogbert

+0

Tôi đã thực sự đề xuất câu trả lời thứ hai (nên có quy định), loại bỏ các bản sao mà không cần phân loại. –

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

Giống như câu trả lời đầu tiên của tôi: nó sẽ thất bại ở phần tử cuối cùng của mảng. – Jivings

Các vấn đề liên quan