2013-01-09 49 views
26

Tôi muốn hiển thị lịch sử duyệt sản phẩm, vì vậy tôi đang lưu trữ các id sản phẩm trong cookie của trình duyệt.Tôi có thể giới hạn độ dài của một mảng trong JavaScript không?

Bởi vì danh sách lịch sử được giới hạn trong 5 mục, tôi chuyển đổi giá trị cookie thành một mảng, sau đó kiểm tra độ dài của nó và cắt bỏ dư thừa.

Mã bên dưới là những gì tôi đã thử, nhưng nó không hoạt động; mục mảng không bị xóa.

Tôi muốn hỏi cách giới hạn chiều dài mảng sao cho nó chỉ có thể lưu trữ 5 mục?

Hoặc

Làm cách nào để cắt các mục sau chỉ mục mảng 4?

var id = product_id; 
var browseHistory = $.cookie('history'); 
if (browseHistory != null) { 
    var old_cookie = $.cookie('history'); 
    var new_cookie = ''; 

    if (old_cookie.indexOf(',') != -1) { 
    var arr = old_cookie.split(','); 
    if (arr.length >= 5) { 
     arr.splice(4, 1) 
    } 
    } 

    new_cookie = id + ',' + old_cookie; 
    $.cookie('history', new_cookie, { expires: 7, path: '/' }); 
} else { 
    $.cookie('history', id, { expires: 7, path: '/' }); 
} 
+0

nối của bạn có vẻ tốt đẹp, ngoại trừ bạn có thể làm 'arr.splice (4, arr.length - 4)' để chắc chắn. bạn có nói rằng mối nối không hoạt động hoặc cookie? bạn đang thiết lập new_cookie cho old_cookie, vẫn còn chứa 5+ mục ... – Rhumborl

Trả lời

43

Bạn không sử dụng mối nối một cách chính xác:

arr.splice(4, 1) 

này sẽ loại bỏ 1 mục tại index 4. thấy here

Tôi nghĩ rằng bạn muốn sử dụng slice:

arr.slice(0,5) 

điều này sẽ trả về các phần tử ở vị trí 0 đến 4.

Điều này giả định rằng tất cả phần còn lại của mã (cookie, v.v.) hoạt động chính xác

1

Bạn cần sử dụng mảng rút gọn sau khi bạn xóa các mục khỏi nó. Bạn đang bỏ qua mảng rút gọn.

Bạn chuyển đổi cookie thành một mảng. Bạn giảm độ dài của mảng và sau đó bạn không bao giờ sử dụng mảng được rút ngắn đó. Thay vào đó, bạn chỉ cần sử dụng cookie cũ (một cookie cũ).

Bạn nên chuyển đổi mảng được rút ngắn lại thành chuỗi bằng .join(",") và sau đó sử dụng nó cho cookie mới thay vì sử dụng old_cookie không được rút ngắn.

Bạn cũng có thể không sử dụng chính xác .splice() nhưng tôi không biết chính xác mục tiêu của bạn là rút ngắn mảng. Bạn có thể đọc về chức năng chính xác của .splice()here.

5

Các fastest và đơn giản nhất Cách thứ nhất là bằng cách thiết lập .length sở hữu chiều dài mong muốn:

arr.length = 4; 

Đây cũng là cách mong muốn để thiết lập lại/mảng trống:

arr.length = 0; 

Đặt lại: đặt thuộc tính này cũng có thể khiến mảng dài hơn: Nếu chiều dài của nó là 2, chạy arr.length = 4 sẽ thêm hai mục undefined vào đó.Có lẽ thêm một điều kiện:

if (arr.length > 4) arr.length = 4; 
+0

Có nhiều điều cẩn trọng hơn và tôi nghĩ phương pháp này nên tránh. Ví dụ, hãy thử ánh xạ trên mảng với các mục không xác định được tạo ra như thế này. Một cái gì đó như 'arr.map (a => 1)' Các mục không xác định sẽ vẫn không xác định. – Nate

+0

Không chắc chắn cách áp dụng; Điều này là để cắt một mảng thành một kích thước ngắn hơn, không được đặt/increse kích thước của nó bằng cách tạo thêm [khoảng trống] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ Array # Parameters). –

+0

"Điều này đang cắt một mảng thành kích thước ngắn hơn". Caveat của bạn nói ngược lại. Điều này mở rộng mảng có thể ảnh hưởng đến các thao tác trong tương lai, như ánh xạ trên mảng để hiển thị các phần tử li. – Nate

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