2012-04-13 29 views
9

Tôi về cơ bản muốn thể hiện hành vi sau bằng cách sử dụng _.each() hoặc _.map() trong Underscore.js.Có thể lặp qua hai danh sách cùng lúc trong Underscore.js không?

a = [1, 2, 3] 
b = [3, 2, 1] 

# Result list 
c = [0, 0, 0] 

for i in [0 .. a.length - 1] 
    c[i] = a[i] + b[i] 

này chắc chắn là có thể trong Matlab (ngôn ngữ chính của tôi) như vậy:

c = arrayfun(@(x,y) x+y, a, b) 

trực giác, nó cảm thấy như cú pháp trong gạch nên là:

c = _.map(a, b, function(x, y){ return x + y;}) 

Tuy nhiên, đó danh sách đối số không được chấp nhận; tham số thứ hai được cho là một hàm có thể gọi.

Đối số "ngữ cảnh" tùy chọn sẽ không giúp tôi trong trường hợp này.

Trả lời

14

Sử dụng zip (cũng từ underscore.js) cho điều đó. Một cái gì đó như thế này:

var a = [1, 2, 3]; 
var b = [4, 5, 6]; 
var zipped = _.zip(a, b); 
// This gives you: 
// zipped = [[1, 4], [2, 5], [3, 6]] 

var c = _.map(zipped, function(pair) { 
    var first = pair[0]; 
    var second = pair[1]; 
    return first + second; 
}); 

// This gives you: 
// c = [5, 7, 9] 

dụ làm việc:

+1

Nhờ một tấn! Điều đó thực sự hữu ích. – mrjoelkemp

+0

Điều chắc chắn, rất vui được trợ giúp! –

+0

@ icyrock.com Khi tôi thay thế các giá trị trong mảng 'a' và' b' bằng ** Strings ** Chức năng '_.zip' của Underscore lưu giữ độ dài ** của mảng ** thay vì giá trị. Bạn có thể xác nhận điều này không? Làm thế nào bạn sẽ thực hiện cùng một kịch bản nhưng với Strings thay vì số nguyên? – JJD

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