2016-07-07 31 views
8

Hãy nói rằng tôi có một mảng với các yếu tố dữ liệu, trong ví dụ này số, như thế này:Giới hạn kích thước mảng

var a = [432, 238, 122, 883, 983]; 

Và tôi muốn giới hạn mảng, vì vậy mỗi lần mà tôi thêm một yếu tố để các mảng, nó luôn luôn giữ một chiều dài của chúng ta hãy nói 7, hoặc ít hơn và loại bỏ các yếu tố lâu đời nhất.

aproach hiện tại của tôi trông như thế này:

function add(x) { 
    a.unshift(x); 
    a = a.slice(0, 7); 
} 

Nó hoạt động tốt, nhưng không phải là có một cách thanh lịch hơn để làm điều đó, giống như một dòng hoặc một cái gì đó?

Chỉnh sửa: Bằng cách "thêm thanh lịch", tôi không cần thêm hàm và chỉ có thể dễ dàng đặt mã ở nơi tôi cần, mà không cần nhập ví dụ ba lần và chỉ có một dòng cũng sẽ làm cho mã "rõ ràng"

+4

"một dòng" không có nghĩa là "cách thanh lịch hơn". Mã của bạn tốt như thế này. –

+0

Tại sao? Mã này ngắn, dễ đọc, làm những gì bạn muốn, bất cứ ai cũng có thể hiểu được. Tại sao bạn sẽ săn tìm biến thể ngắn hơn của một thứ gì đó quá ngắn ngủi? – Mjh

+1

'a = [x, ... a.slice (0, 6)]' – zerkms

Trả lời

9

Chỉ cần thêm một lựa chọn tốt:

a = [x, ...a.slice(0, 6)]; 

Mặc dù cá nhân tôi sẽ chọn Nina Scholz 's solution (với một "tốt hơn" điều kiện cho việc thay đổi chiều dài và cũ môi trường mà ES6 không được hỗ trợ)

Tham khảo:

+0

Trình duyệt hỗ trợ cho điều này là gì? – super

+0

@Murplyx mọi hiện đại https://kangax.github.io/compat-table/es6/ – zerkms

3

Bạn có thể kiểm tra độ dài của mảng khi thêm và Shift nó (loại bỏ các yếu tố đầu tiên) nếu chiều dài đã trôi qua:

function add(x) { 
    a.push(x); 
    if (a.length > 7) 
     a.shift(); 
} 
5

Chỉ cần điều chỉnh các thuộc tính length sau khi đẩy .

function add(x) { 
    a.unshift(x); 
    a.length = a.length < 7 ? a.length : 7; 
} 

Các cleanes cách là để kiểm tra trước khi

function add(x) { 
    a.unshift(x); 
    if (a.length > 7) { 
     a.length = 7; 
    } 
} 
+0

Bạn vẫn cần phải kiểm tra xem chiều dài hiện tại có lớn hơn 7 không, nếu không nó sẽ mở rộng các mảng nhỏ hơn với các lỗ. – zerkms

+2

'a.length = a.length <7? a.length: 7; '--- ugh, thật khó chịu :-) – zerkms

+2

Bạn có thể thử a.length = Math.min (a.length, 7) – Rajesh

0
a=add(188); 

function add(x){ 
    a.push(x); 
    return a.slice(1); 
} 
+0

Bạn có thể cung cấp một số bối cảnh cho câu trả lời của mình, giải thích cách trả lời câu hỏi không? –

0

Bạn cũng có thể sử dụng Array.pop. Ngoài ra nếu bạn muốn thêm thuộc tính vào mảng, bạn có thể làm cho nó trở thành chung chung.

Array.prototype.Limit_push = function(x) { 
 
    this.unshift(x); 
 
    if (this.maxLength !== undefined && this.length > this.maxLength) 
 
    this.pop(); 
 
} 
 

 
var a = []; 
 
a.maxLength = 7 
 
for (var i = 0; i < 10; i++) { 
 
    a.Limit_push(i); 
 
    console.log(a) 
 
} 
 

 
var b = []; 
 
for (var i = 0; i < 10; i++) { 
 
    b.Limit_push(i); 
 
    console.log(b) 
 
}

0

Nếu bạn muốn, bạn có thể sửa đổi các nguyên mẫu của đối tượng Array. Bằng cách này, tất cả các mảng của bạn có thể có độ dài tối đa của riêng chúng.

Điều này rẻ và hiệu quả nhưng có thể không hoạt động tốt với các thư viện và plugin khác.

Array.prototype.maxLength = Number.MAX_VALUE; 
 
Array.prototype.add = function(item) { 
 
    this.push(item); 
 
    this.adjustLength(); 
 
} 
 
Array.prototype.adjustLength = function() { 
 
    this.length = Math.min(this.length, this.maxLength); 
 
} 
 

 

 
var a = [432, 238, 122, 883, 983]; 
 
a.maxLength = 7; 
 

 
a.add(1); 
 
a.add(2); 
 
a.add(3); // Ignored 
 
a.add(4); // Ignored 
 

 
document.body.innerHTML = '<ol start="0">'+a.map(function(i){return'<li>'+i+'</li>'}).join('')+'</ol>';
ol li:before { content: '\0020\21d2\0020'; }

Nếu bạn tạo đối tượng lớp của riêng bạn và đại biểu đến một mảng cơ bản, bạn có thể làm điều này nhiều hơn di động và mở rộng.

function MyList(arr, maxLength) { 
 
    this.arr = arr || []; 
 
    this.maxLength = maxLength || Number.MAX_VALUE; 
 
} 
 

 
MyList.prototype = { 
 
    add : function(item) { 
 
    this.arr.push(item); 
 
    this.adjustLength(); 
 
    }, 
 
    adjustLength : function() { 
 
    this.arr.length = Math.min(this.arr.length, this.maxLength); 
 
    }, 
 
    get : function() { 
 
    return this.arr; 
 
    } 
 
}; 
 

 
var a = new MyList([432, 238, 122, 883, 983], 7); 
 

 
a.add(1); 
 
a.add(2); 
 
a.add(3); // Ignored 
 
a.add(4); // Ignored 
 

 
document.body.innerHTML = '<ol start="0">'+a.get().map(function(i){return'<li>'+i+'</li>'}).join('')+'</ol>';
ol li:before { content: '\0020\21d2\0020'; }

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