2012-06-03 29 views
6

Tôi đang cố gắng tìm cách sử dụng chức năng Array.prototype.map() của JS với hàm có thêm một tham số nữa (nếu có thể, và tôi muốn đến tránh phải viết lại được xây dựng trong Array.prototype.map()). Tài liệu này là rất tốt, nhưng không bao gồm cơ chế "một hay-hơn-thêm tham số" trường hợp:Gọi lại JS sử dụng map() với hàm có thêm một tham số

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map

function doOpSingle(elem) 
{ 
// do something with one array element 
} 

var A = ["one", "two", "three", "four"]; 
var x = A.map(doOpSingle); // this will execute doOpSingle() on each array element 

Cho đến nay, như vậy tốt. Nhưng nếu chức năng được đề cập có thông số hai thông số, như e. g. một lá cờ bạn có thể muốn HOẶC đến nó (suy nghĩ của mặt nạ bit)

function doOpSingle2(arrelem,flag) 
{ 
// do something with one array element 
} 

var A = ["one", "two", "three", "four"]; 
var theFlag = util.getMask(); // call external function 
var y = A.map(doOpSingle2(theFlag)); // this does not work! 

Bất kỳ giải pháp nên làm mà khôngfor vòng, tất nhiên, bởi vì đó là lý do tại sao chúng tôi có map(), để làm cho mã sạch của chúng tôi w/nhận loại bỏ những thứ này!

Trả lời

17

Sử dụng chức năng ẩn danh:

A.map(function(a) {return doOpSingle2(a,theFlag);}); 
+0

+1, được nhận ra sau khi đăng câu trả lời của tôi :) – SuperSaiyan

+0

TY! Điều này rất có thể sẽ là cách duy nhất để thực hiện nhiệm vụ này (ngoài bind()). Cũng nhờ những người trả lời khác. – syntaxerror

1

Sử dụng chức năng ẩn danh.

var y = A.map(function(x){doOpSingle2(x,theFlag);}); 
15

A.map(doOpSingle2.bind(null, theFlag))

theFlag sẽ là người đầu tiên lập luận mặc dù:

function doOpSingle2(flag, elem) { ... }

+0

Yêu kỹ thuật bind() này, cảm ơn! – syntaxerror

1

Edit: Nevermind, bạn không thực sự cần đóng cửa cho việc này. Xem câu trả lời của Esailija.

Có một tùy chọn khác, nếu bạn tình cờ sử dụng Closure library. Trước tiên, bạn phải viết lại doOpSingle2 để lá cờ là lần đầu tiên:

function doOpSingle2(flag, arrelem) 
{ 
// do something with one array element 
} 

sau đó bạn có thể làm

var y = A.map(goog.partial(doOpSingle2, theFlag)); 

goog.partial phần áp dụng chức năng, vì vậy goog.partial(doOpSingle2, theFlag) tương đương với chức năng này:

function(arrElem) { 
    return doOpSingle2(theFlag, arrElem); 
} 

Trong trường hợp cụ thể này, tôi có thể sẽ không đề xuất phương pháp này, nhưng có thể có tình huống tương tự s nơi nó hoạt động tốt.

+1

javascript có thể đã làm currying với '.bind' mặc dù – Esailija

+0

Đây là vấn đề rất. Nó sẽ chỉ là quá mức cần thiết để sử dụng một thư viện bên ngoài cho vấn đề nhỏ này. Nhưng vẫn còn, nhờ anyway cho phương pháp này. Trong một dự án lớn _real_, tôi có thể cần kỹ thuật này một ngày nào đó. ;) – syntaxerror

+0

Đó là lý do tại sao tôi nói "nếu bạn tình cờ sử dụng Closure" thay vì "bạn nên bỏ mọi thứ ngay bây giờ và bắt đầu sử dụng Closure" theo cách [một số người làm] (http://meta.stackexchange.com/a/ 19492/65977);). – MatrixFrog

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