“Đối tượng không hỗ trợ thuộc tính hoặc phương thức 'find'" trong IE


78
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

    <script>

        $(document).ready(function () {


            var data = [{
                "Id": "SWE",
                "Country": "Sweden",
                "Population": 9592552
            }, {
                "Id": "NOR",
                "Country": "Norway",
                "Population": 5084190
            }];


            function display(e) {
                alert("E" + e);
                var countryData = data.find(function (element, index, array) {
                    return element.Id === e;
                });
                alert(countryData.Population);
            }
            display('SWE');


        });


    </script>
</head>
</html>

Đoạn mã được đăng ở trên đang hoạt động bình thường trên Firefox và Chrome nhưng tôi gặp lỗi trong Internet Explorer. Thông báo lỗi:

Đối tượng không hỗ trợ thuộc tính hoặc phương pháp 'tìm'


Bạn đang thử nghiệm (các) phiên bản IE nào? Ngoài ra, nó đang ở chế độ tiêu chuẩn, chế độ tương thích hay chế độ kỳ quặc?
Simba

hi @Simba tôi đang sử dụng trình duyệt IE phiên bản 11.0.9660.18321
GOPAL Yadav

để kiểm tra xem trình duyệt nào hỗ trợ tính năng nào, caniuse.com rất hữu ích, chỉ để tham khảo trong tương lai.
Rachel Gallen

Câu trả lời:


50

Đây là một công việc xung quanh. Bạn có thể sử dụng bộ lọc thay vì tìm; nhưng bộ lọc trả về một mảng các đối tượng phù hợp. findchỉ trả về kết quả phù hợp đầu tiên bên trong một mảng. Vì vậy, tại sao không sử dụng bộ lọc như sau;

data.filter(function (x) {
         return x.Id === e
    })[0];

3
Gần đây, bạn đã gặp vấn đề này trên một dự án và sự đồng thuận chung là sử dụng @ babel / polyfill. Đã đi theo tuyến đường đó và phát hiện ra polyfill thực sự tạo ra một số lỗi kỳ lạ, vì vậy chúng tôi phải kéo nó. Giải pháp này, tuy nhiên, được nhắm mục tiêu cao, giải quyết vấn đề mà không có bất kỳ tác dụng phụ nào. Đơn giản, sạch sẽ, đi thẳng vào vấn đề. Cảm ơn bạn!
David Vasquez

4
Đơn giản nhất, sạch sẽ nhất, công việc tương đương cho những người cần duy trì khả năng tương thích với IE11, cảm ơn!
Mark Seagoe

1
Sự khác biệt chính giữa các hàm filter () và find () là filter () đi qua tất cả các mảng và find () chỉ cho lần xuất hiện đầu tiên. Cách giải quyết này có thể gây ra một số vấn đề về hiệu suất.
Filip Kováč

43

Như đã đề cập array.find()không được hỗ trợ trong IE.

Tuy nhiên, bạn có thể đọc về Polyfill tại đây:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find#Polyfill

Phương pháp này đã được thêm vào đặc tả ECMAScript 2015 và có thể chưa có sẵn trong tất cả các triển khai JavaScript. Tuy nhiên, bạn có thể polyfill Array.prototype.find bằng đoạn mã sau:

Mã:

// https://tc39.github.io/ecma262/#sec-array.prototype.find
if (!Array.prototype.find) {
  Object.defineProperty(Array.prototype, 'find', {
    value: function(predicate) {
     // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If IsCallable(predicate) is false, throw a TypeError exception.
      if (typeof predicate !== 'function') {
        throw new TypeError('predicate must be a function');
      }

      // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
      var thisArg = arguments[1];

      // 5. Let k be 0.
      var k = 0;

      // 6. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kValue be ? Get(O, Pk).
        // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. If testResult is true, return kValue.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return kValue;
        }
        // e. Increase k by 1.
        k++;
      }

      // 7. Return undefined.
      return undefined;
    }
  });
}

40

Bạn đang sử dụng array.find()phương pháp JavaScript . Lưu ý rằng đây là JS chuẩn và không liên quan gì đến jQuery. Trên thực tế, toàn bộ mã của bạn trong câu hỏi hoàn toàn không sử dụng jQuery.

Bạn có thể tìm thấy tài liệu array.find()tại đây: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find

Nếu bạn cuộn xuống cuối trang này, bạn sẽ lưu ý rằng nó có thông tin hỗ trợ trình duyệt và bạn sẽ thấy rằng nó nói rằng IE không hỗ trợ phương pháp này.

Trớ trêu thay, cách tốt nhất của bạn để giải quyết vấn đề này là sử dụng jQuery, có chức năng tương tự được hỗ trợ trong tất cả các trình duyệt.


Một lựa chọn thứ hai là để cuộn của riêng bạn cho vòng lặp, nếu vì một lý do kỳ lạ bạn không được phép sử dụng jQuery
Stephan

22
Hoặc chỉ cần làmarray.filter()[0]
Rok Burgar

4
lol'd tại "Trớ trêu thay, cách tốt nhất của bạn xung quanh này sẽ được sử dụng jQuery" :)
Ivan Durst

33

Array.prototype.find không được hỗ trợ trong bất kỳ phiên bản IE nào

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find


9
Và trang cung cấp một polyfill hữu ích
GillesC

1
Polyfill chỉ hoạt động tốt, nó kiểm tra xem prototype.find có không được xác định hay không, và sau đó nó xác định thuộc tính cho Array.prototype: Object.defineProperty (Array.prototype, 'find', {Cảm ơn!
Leo

5

Tôi đã giải quyết vấn đề tương tự bằng cách thêm polyfill sau:

<script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=default,Array.prototype.includes,Array.prototype.find"></script>

Polyfill là một đoạn mã (thường là JavaScript trên Web) được sử dụng để cung cấp chức năng hiện đại trên các trình duyệt cũ hơn vốn không hỗ trợ nó.

Hy vọng ai đó thấy điều này hữu ích.



-7

Các Array.findhỗ trợ phương pháp cho các trình duyệt của Microsoft bắt đầu với cạnh .

Bảng tương thích của W3Schools nói rằng hỗ trợ bắt đầu trên phiên bản 12, trong khi bảng tương thích Tôi có thể sử dụng cho biết rằng hỗ trợ không xác định giữa phiên bản 12 và 14, được hỗ trợ chính thức bắt đầu từ phiên bản 15.


14
IE12 không tồn tại. Trình duyệt bạn đang xem với biểu tượng chữ 'e' màu xanh hiện được gọi là Edge và khác biệt đáng kể so với người tiền nhiệm IE.
Simba
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.