2012-01-13 43 views
6

Tôi đã không nhận thức được sự tương thích crossbrowser xấu của array.indexOf(). Nhưng bây giờ tôi, tôi cần phải tìm cách để đạt được điều tương tự nhưng không sử dụng phương pháp trước đó.Crossbrowser "inArray" chức năng (không có jQuery)

Tôi đã thử googling một lúc, nhưng không tìm thấy câu trả lời thuyết phục thực sự. Còn bây giờ, tôi đang làm nó với vòng (nhưng điều này là chậm và tôi chắc chắn có những cách tốt hơn)

Side Ghi chú:

  • tôi không thể sử dụng jQuery hoặc bất kỳ thư viện khác/khung .
  • Nó không nhất thiết cần phải trả lại chỉ số (một cách đơn giản đúng/sai sẽ ok)

tôi nghĩ rằng nó không phải là cần thiết để chia sẻ mã của tôi, vì tất cả các bạn biết làm thế nào mảng vòng lặp kiểm tra trông giống như (cộng với nó sẽ làm giảm chỉ số IQ của bạn)

+0

Bạn có thể sử dụng ['indexOf' shim] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility) do Mozilla cung cấp. –

+0

Bạn muốn cung cấp 'IE lt 9' với [ES5-shim] (https://github.com/kriskowal/es5-shim) ... –

+0

Vòng lặp không tệ chút nào. [Chỉ số 'indexOf' của V8 cũng sẽ giảm xuống một.] (Http://www.google.com/codesearch#OAMlx_jo-ck/src/v8/src/array.js&l=1207) – pimvdb

Trả lời

6

Dưới đây là làm thế nào inArray được thực hiện trong jQuery:

function inArray(elem, array, i) { 
    var len; 
    if (array) { 
     if (array.indexOf) { 
      return array.indexOf.call(array, elem, i); 
     } 
     len = array.length; 
     i = i ? i < 0 ? Math.max(0, len + i) : i : 0; 
     for (; i < len; i++) { 
      // Skip accessing in sparse arrays 
      if (i in array && array[ i ] === elem) { 
       return i; 
      } 
     } 
    } 
    return -1; 
} 

Bạn không thể sử dụng jQuery nhưng tại sao không sử dụng triển khai của họ? :-)

Trân trọng!

+1

Lý do có thể nhất là giáo viên của anh ấy đã cố gắng làm cho anh ta có được mã riêng của mình. – kennebec

+1

@kennebec Tôi là giáo viên của riêng mình (tôi tự học và theo sở thích) – mithril333221

1

còn bây giờ, tôi đang làm nó với vòng (nhưng điều này là chậm và tôi chắc chắn có những cách tốt hơn)

Không có vấn đề gì bạn làm , nó sẽ ở cuối d ay liên quan đến vòng lặp. Trừ khi bạn phát minh ra một thuật toán O (1) để tìm kiếm bên trong một mảng. Không có gì sai khi sử dụng vòng lặp để tìm phần tử tương ứng. Bạn thậm chí có thể mở rộng đối tượng mảng dựng sẵn bằng phương thức này để bạn có thể tái sử dụng nó.

2

Từ MDN:

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function (searchElement /*, fromIndex */) { 
     "use strict"; 
     if (this == null) { 
      throw new TypeError(); 
     } 
     var t = Object(this); 
     var len = t.length >>> 0; 
     if (len === 0) { 
      return -1; 
     } 
     var n = 0; 
     if (arguments.length > 0) { 
      n = Number(arguments[1]); 
      if (n != n) { // shortcut for verifying if it's NaN 
       n = 0; 
      } else if (n != 0 && n != Infinity && n != -Infinity) { 
       n = (n > 0 || -1) * Math.floor(Math.abs(n)); 
      } 
     } 
     if (n >= len) { 
      return -1; 
     } 
     var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); 
     for (; k < len; k++) { 
      if (k in t && t[k] === searchElement) { 
       return k; 
      } 
     } 
     return -1; 
    } 
} 

này kiểm tra nếu nó thấy một thực hiện bản xứ, nếu không thực hiện nó.

Quirks đáng chú ý:

t.length >>> 0; là một sự thay đổi unsigned cho lực lượng này cho một số dương

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