2010-07-06 20 views
24

Tôi nhận thấy rằng một số mã đánh giá một số kích thước giày cho trang web thương mại điện tử và xuất chúng trên màn hình đang làm rối trật tự trong Chrome.Chrome sắp đặt lại khóa đối tượng nếu số, bình thường/mong đợi

JSON được có thể là:

{ 
    "7": ["9149", "9139", "10455", "17208"], 
    "7.5": ["9140", "9150", "10456", "17209"], 
    "8": ["2684", "9141", "10457", "17210"], 
    "8.5": ["9142", "10444", "10458", "17211"], 
    "9": ["2685", "9143", "10459", "17212"], 
    "9.5": ["10443", "9144", "10460", "17213"] 
} 

... có nghĩa là tăng kích thước trong nửa.

Sau khi chuyển đổi thành một đối tượng và lặp lại mặc dù các phím, trật tự tự nhiên đã được tôn trọng và họ đi ra như:

7, 7.5, 8, 8.5, vv

Nhưng trong Chrome chỉ, phím mà 'look' như số vòng LUÔN đi ra khỏi đối tượng đầu tiên, vì vậy sản phẩm của một cho ... trong vòng lặp là:

7, 8, 9, 7. 5, 8,5, 9,5 ...

Object.keys(sizes); // ["7", "8", "9", "7.5", "8.5", "9.5"] 

Đây là trường hợp thử nghiệm: https://jsfiddle.net/wcapc46L/1/

Nó chỉ ảnh hưởng đến toàn bộ số, có vẻ như Webkit/Blink có một tối ưu hóa mà thích thuộc tính đối tượng được số, có thể nó là để làm với Dự đoán chi nhánh hoặc bất cứ điều gì.

Nếu bạn có tiền tố chìa khóa đối tượng với bất kỳ ký tự, trật tự vẫn không bị ảnh hưởng và làm việc như dự định - FIFO

Tôi nghĩ rằng tôi nhớ đọc mà không có bảo đảm về trình tự của các thuộc tính của một đối tượng nhưng đồng thời gian, điều này gây phiền toái cho sự khắc nghiệt và sẽ gây ra một lượng đáng kể nỗ lực trong việc sửa chữa nó cho người dùng chrome một mình.

Bất kỳ ý tưởng nào? đây có phải là lỗi có thể được khắc phục không?

chỉnh sửa thêm vào đó, bây giờ tôi đã phát hiện ra đây là một vấn đề trên tracker v8 lỗi:

http://code.google.com/p/v8/issues/detail?id=164

Hình như Blink không muốn để sửa lỗi này và sẽ vẫn là trình duyệt duy nhất mà sẽ làm đi.

cập nhật bất cứ băm bảng tối ưu hóa webkit/chớp đã có, hiện đã làm theo cách của mình vào con tắc kè (FF 27.0.1) - http://jsfiddle.net/9Htmq/ kết quả trong 7,8,9,7.5,8.5,9.5. áp dụng _ trước khi các phím trả về đúng thứ tự/thứ tự dự kiến.

cập nhật 2017 dân vẫn upvoting và chỉnh sửa này để - Nó không có vẻ ảnh hưởng Map/WeakMap, Set vv (như chứng minh bằng cách cập nhật ví dụ chính)

+0

+1 cho trường hợp thử nghiệm. – spender

+4

Tôi nghĩ bạn cần phải sắp xếp lại phương pháp lập kế hoạch ở đây. Nếu bạn * có * đọc rằng thứ tự là không xác định, tại sao bạn phàn nàn về việc phải sửa rất nhiều mã khi bạn phát hiện ra rằng * ngạc nhiên bất ngờ *, nó là không xác định? Đây không phải là một lỗi sẽ được sửa chữa, khác để nói rằng lỗi là trong mã của bạn, bạn dựa vào chi tiết thực hiện, không phải trên hành vi tài liệu. Sửa mã của bạn. –

+1

tại thời điểm phát triển, chrome không ở đâu gần và hiện tại chiếm tới 7% người dùng trang web. cho đến khi chrome xuất hiện, nó hoạt động như dự định trong tất cả các trình duyệt, bao gồm safari - vì vậy nó không phải là vấn đề về webkit.và có, tôi hiểu rằng nó có thể cần tái cấu trúc nhưng đã được hy vọng của một giải pháp dễ dàng hơn (hoặc rằng chrome sẽ thực sự được sửa chữa này giống như tất cả mọi người khác). cho bây giờ, tôi có thể phải tiền tố tất cả các thuộc tính đối tượng với __ hoặc một cái gì đó để buộc tự nhiên định nghĩa. –

Trả lời

20

Đó là cách v8 xử lý các mảng liên kết. Đã xảy ra sự cố đã biết Issue 164 nhưng nó tuân theo thông số được đánh dấu là 'hoạt động như dự định'. Không có thứ tự bắt buộc để lặp qua các mảng kết hợp.

Một cách giải quyết đơn giản là đi trước các giá trị số với chữ ví dụ: 'size_7':['9149','9139'], vv

Tiêu chuẩn này sẽ thay đổi trong ECMAScript đặc tả sau buộc [chrome] nhà phát triển để thay đổi điều này.

+1

thay đổi về lợi ích của việc triển khai hiện tại của Chrome hoặc ủng hộ việc duy trì thứ tự định nghĩa? –

+2

giữ nguyên thứ tự vì tất cả các trình duyệt khác đã thực hiện việc này. –

+0

tin tuyệt vời! cảm ơn rất nhiều. –

1

Nó sẽ xuất hiện mà Chrome đang điều trị số số nguyên chuỗi như thể đó là loại số khi được sử dụng làm tên chỉ mục/thuộc tính. Tôi nghĩ rằng dựa vào việc thực hiện Javascript để bảo vệ thứ tự của những gì, trong một số trường hợp, là thuộc tính đối tượng và trong các trường hợp khác (chắc chắn với chỉ số mảng chrome), là một cách tiếp cận không an toàn và thứ tự liệt kê có lẽ không phải là được xác định trong spec. Tôi khuyên bạn nên thêm thuộc tính bổ sung vào JSON cho biết thứ tự sắp xếp:

{ 
    "7":{"sortOrder":1,"data":["9149","9139","10455","17208"]}, 
    "7.5":{"sortOrder":2,"data":["9140","9150","10456","17209"]} 
    //etc 
} 
+0

có thể hoạt động - tôi có thể áp dụng bộ lọc kiểm tra thuộc tính sortOrder khi lặp và chèn các phần tử tương ứng trong DOM. –

0

Tôi không nghĩ bạn có thể gọi đây là lỗi. Giống như bạn tự nói, không có garantee về cách các thuộc tính của một đối tượng được sắp xếp.

+0

Và đó không phải là câu trả lời. –

1

Chúng đang được coi là chuỗi vì chúng là các chuỗi. Đề xuất tốt nhất của tôi là sử dụng cùng một "độ chính xác" trong tất cả các phím của bạn.

{"7.0":["9149","9139","10455","17208"],"7.5":["9140","9150","10456","17209"],"8.0":["2684","9141","10457","17210"],"8.5":["9142","10444","10458","17211"],"9.0":["2685","9143","10459","17212"],"9.5":["10443","9144","10460","17213"]} 

Vì vậy, "8,0" thay vì "8", vv

Thậm chí sau đó, không có bảo lãnh, nhưng nó có nhiều khả năng là họ sẽ đi ra theo đúng thứ tự.

Để đảm bảo tốt hơn, hãy thực hiện sắp xếp dựa trên các phím, đặt các giá trị vào một mảng theo thứ tự được sắp xếp.

+0

rất tiếc, mặc dù điều này sẽ hiệu quả đối với trường hợp kiểm tra, đây sẽ không phải là một tùy chọn để triển khai. kích thước là vô số các tùy chọn khác nhau, chẳng hạn như 'S, M, L, XL, XXL 'hoặc '44, 44.5,44.5' hoặc 'Một Kích thước', v.v., như được xác định trên cơ sở mỗi sản phẩm của người bán. có logic rất lớn liên quan đến việc phân loại đầu ra từ MYSQL để nó đến đúng thứ tự và không phải là chuỗi - nó bao gồm khoảng 40 kích cỡ riêng biệt được xác định trước theo thứ tự ưu tiên. –

1

Khi lặp qua các thuộc tính của đối tượng, thứ tự được chỉ định trong đặc tả ECMAScript là không xác định và bất kỳ thứ tự nào bạn có thể quan sát được trong một số môi trường không nên dựa vào. Nếu bạn cần đặt hàng, hãy sử dụng số Array.

0

Tôi tìm thấy một công việc dễ dàng xung quanh sử dụng underscore.js

myArray = _.sortBy(myArray, function(num){ return Math.ceil(num); }); 

Yay! myArray đã trở lại đúng thứ tự trong tất cả các trình duyệt.

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