2014-06-07 42 views
11

Tôi muốn tính tổng giá trị của một dãy số với giá trị tương ứng của nó trong một dãy số khác nhau và tôi muốn thực hiện điều này mà không lặp qua từng giá trị riêng lẻ.
Vì vậy:Javascript - Tổng hai mảng trong một lần lặp

var array1 = [1,2,3,4]; 
var array2 = [5,6,7,8]; 

var sum = [6,8,10,12]; 

Nhưng, tôi rất muốn làm điều đó trong một ngã swoop, thay vì làm điều này:

for(var i = 0; i < array1.length; i++){ 
    sum.push(array1[i] + array2[i]); 
} 

bất cứ ai có thể nghĩ ra một cách? Tôi khá bối rối.

+1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map ... bạn phải lặp một cách này hay cách khác . –

+0

Không có phép toán mảng nào được tích hợp vào ngôn ngữ sẽ làm điều này cho bạn. Viết cho mình một chức năng nhỏ để làm điều đó và chỉ cần gọi hàm đó bất cứ khi nào bạn cần. – jfriend00

+1

@ jfriend00 - đây là lần duy nhất tôi muốn bất kỳ ngôn ngữ nào khác là R. – TheNovice

Trả lời

20

Tôi biết đây là một câu hỏi cũ nhưng tôi chỉ thảo luận vấn đề này với ai đó và chúng tôi đã đưa ra một giải pháp khác. Bạn vẫn cần một vòng lặp nhưng bạn có thể thực hiện điều này với Array.prototype.map().

var array1 = [1,2,3,4]; 
var array2 = [5,6,7,8]; 

var sum = array1.map(function (num, idx) { 
    return num + array2[idx]; 
}); // [6,8,10,12] 
+0

Vâng, và nếu array1 num lặp lại thì sao? –

+0

@VladMiller Đó là một điểm tốt. Tôi đã không nhận ra tại thời điểm phương thức map() của JavaScript thực sự cho phép bạn truy cập vào chỉ mục cũng như giải quyết vấn đề đó. Tôi đã cập nhật mã để phản ánh điều đó. – twalters

2

Bạn không thể tránh vòng lặp, nhưng bạn có thể làm điều này một lần và thêm một chức năng cho tất cả các đối tượng mảng bằng cách sử dụng Array.prototype.

Dưới đây là và Ví dụ:

// Add a SumArray method to all arrays by expanding the Array prototype(do this once in a general place) 
Array.prototype.SumArray = function (arr) { 
    var sum = []; 
    if (arr != null && this.length == arr.length) { 
     for (var i = 0; i < arr.length; i++) { 
      sum.push(this[i] + arr[i]); 
     } 
    } 

    return sum; 
} 

// here's your code 
var array1 = [1, 2, 3, 4]; 
var array2 = [5, 6, 7, 8]; 
var sum = array1.SumArray(array2); 
console.log(sum); // [6,8,10,12] 

Dưới đây là Fiddle của bạn.

+0

Phá vỡ đóng gói: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain#Bad_practice.3A_Extension_of_native_prototypes – HMR

2

Chỉ cần nhập câu trả lời Popovich và twalters.

Array.prototype.SumArray = function (arr) { 

     var sum = this.map(function (num, idx) { 
      return num + arr[idx]; 
     }); 

     return sum; 
    } 
var array1 = [1,2,3,4]; 
var array2 = [5,6,7,8]; 
var sum = array1.SumArray(array2); 
console.log(sum); // [6,8,10,12] 
6
var arr = [1,2,3,4]; 
var arr2 = [1,1,1,2]; 

var squares = arr.map((a, i) => a + arr2[i]); 

console.log(squares); 
+0

Làm thế nào bạn sẽ đi về việc có hai mảng lồng nhau như là chỉ số của người khác? như vậy ... [[5, 2, 3], [2, 2, 3, 10, 6]] – Winnemucca

0

Dưới dụ sẽ làm việc ngay cả với sự thay đổi chiều dài và nhiều hơn nữa vài trường hợp sử dụng. kiểm tra. bạn cũng có thể tạo mẫu thử nếu cần.

function sumArray(a, b) { 
 
     var c = []; 
 
     for (var i = 0; i < Math.max(a.length, b.length); i++) { 
 
     c.push((a[i] || 0) + (b[i] || 0)); 
 
     } 
 
     return c; 
 
} 
 

 
// First Use Case. 
 
var a = [1, 2, 3, 4]; 
 
var b = [1, 2, 3, 4]; 
 
console.log(sumArray(a, b)); 
 

 
// Second Use Case with different Length. 
 
var a = [1, 2, 3, 4]; 
 
var b = [1, 2, 3, 4, 5]; 
 
console.log(sumArray(a, b)); 
 

 
// Third Use Case with undefined values and invalid length. 
 
var a = [1, 2, 3, 4]; 
 
var b = []; 
 
b[1] = 2; 
 
b[3] = 4; 
 
b[9] = 9; 
 
console.log(sumArray(a, b));

+0

Đoạn mã ngày nay cung cấp bảng điều khiển tích hợp. Không cần phải đặt HTML. – Oriol

+0

Cảm ơn đèn của bạn trên câu trả lời của tôi :) được cập nhật ngay bây giờ –

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