2010-03-13 38 views
6

Nó đã được thực hiện cho đến chết khá nhiều, ở đây trên SO và xung quanh 'Net. Tuy nhiên tôi đã tự hỏi nếu có một cách để tận dụng tối thiểu tiêu chuẩn/chức năng tối đa của:Min/Max trên một mảng các đối tượng

Array.max = function(array) { 
    return Math.max.apply(Math, array); 
}; 

Array.min = function(array) { 
    return Math.min.apply(Math, array); 
}; 

Vì vậy, tôi có thể tìm kiếm trên một mảng của các đối tượng của tiếng nói:

function Vector(x, y, z) { this.x = x; this.y = y; this.z = z; } 
var ArrayVector = [ /* lots of data */ ]; 
var min_x = ArrayVector.x.min(); // or 
var max_y = ArrayVector["y"].max(); 

Hiện nay tôi có để lặp thông qua mảng và so sánh các giá trị đối tượng theo cách thủ công và tạo từng giá trị cho nhu cầu cụ thể của vòng lặp. Một mục đích chung hơn sẽ là tốt đẹp (nếu hơi chậm hơn).

Trả lời

6

Bạn có thể thực hiện một số thay đổi để Array.minmax bạn phương pháp để chấp nhận một tên tài sản, trích rằng tài sản của từng đối tượng trong mảng đó, với sự giúp đỡ của Array.prototype.map, và tối đa hoặc giá trị min của những giá trị trích xuất:

Array.maxProp = function (array, prop) { 
    var values = array.map(function (el) { 
    return el[prop]; 
    }); 
    return Math.max.apply(Math, values); 
}; 

var max_x = Array.maxProp(ArrayVector, 'x'); 

Tôi chỉ muốn đề cập đến phương pháp Array.prototype.map trên hầu hết các trình duyệt hiện đại và là một phần của ECMAScript 5th Edition Specification, nhưng Internet Explorer không có, tuy nhiên bạn có thể dễ dàng bao gồm triển khai như trên số Mozilla Developer Center.

+0

Đó là một giải pháp khá thanh lịch. Tôi có thể thấy nó xây dựng một mảng tạm thời mới vì vậy tôi có thể sẽ phải lưu trữ nó hoặc sử dụng nó một cách tiết kiệm. –

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