2013-01-24 29 views
9

Tôi có một mảng đối tượng tôi cần sắp xếp theo chức năng tùy chỉnh, vì tôi muốn thực hiện điều này nhiều lần trên một số thuộc tính đối tượng tôi muốn chuyển tên khóa cho thuộc tính vào hàm tùy chỉnh sắp xếp:js sắp xếp() chức năng tùy chỉnh làm thế nào tôi có thể vượt qua các thông số hơn?

function compareOnOneFixedKey(a, b) { 
    a = parseInt(a.oneFixedKey) 
    b = parseInt(b.oneFixedKey) 
    if (a < b) return -1 
    if (a > b) return 1 
     return 0 
} 

arrayOfObjects.sort(compareByThisKey) 

nên trở thành một cái gì đó như:

function compareOnKey(key, a, b) { 
    a = parseInt(a[key]) 
    b = parseInt(b[key]) 
    if (a < b) return -1 
    if (a > b) return 1 
     return 0 
} 
arrayOfObjects.sort(compareOn('myKey')) 

này có thể được thực hiện trong một cách thuận tiện? cảm ơn.

Trả lời

9

Bạn cần phải partially apply chức năng, ví dụ sử dụng bind:

arrayOfObjects.sort(compareOn.bind(null, 'myKey')); 

Hoặc bạn chỉ cần thực compareOn trở lại các chức năng sắp xếp thực tế, parametrized với các đối số của hàm bên ngoài (như chứng minh bởi những người khác).

+0

+1 cho phương pháp tôi hoàn toàn không xem xét. –

+0

Bên cạnh phương pháp tốt, nó vẫn có vấn đề tương thích. – VisioN

+1

@VisioN:… nhưng làm cho mọi thứ trở nên dễ dàng hơn :-) Đối với bất kỳ ai xem xét hỗ trợ các trình duyệt IE cũ, trang MDN được liên kết có chứa một shim – Bergi

9

Bạn có thể thêm một wrapper:

function compareOnKey(key) { 
    return function(a, b) { 
     a = parseInt(a[key], 10); 
     b = parseInt(b[key], 10); 
     if (a < b) return -1; 
     if (a > b) return 1; 
     return 0; 
    }; 
} 

arrayOfObjects.sort(compareOnKey("myKey")); 
4

Vâng, có so sánh trở về từ một máy phát điện mà phải mất một param đó là chìa khóa bạn muốn

function compareByProperty(key) { 
    return function (a, b) { 
     a = parseInt(a[key], 10); 
     b = parseInt(b[key], 10); 
     if (a < b) return -1; 
     if (a > b) return 1; 
     return 0; 
    }; 
} 
arrayOfObjects.sort(compareByProperty('myKey')); 

compareByProperty('myKey') lợi dụng chức năng để thực hiện so sánh, sau đó được chuyển vào .sort

+0

hoạt động tốt, nhưng đã chọn cách .bind() cho sự linh hoạt của nó. cảm ơn bạn đã refactoring mã của tôi với cơ sở 10 trong parseInt :) –

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