2015-04-09 15 views
13

Tôi đã tìm kiếm và chưa tìm thấy câu hỏi và câu trả lời đơn giản trên ngăn xếp ngăn xếp tìm kiếm mức trung bình của một mảng.Tìm mức trung bình của một mảng bằng cách sử dụng JS

Đây là mảng mà tôi có

var grades = [80, 77, 88, 95, 68]; 

đầu tiên tôi nghĩ rằng câu trả lời cho vấn đề này sẽ là một cái gì đó như thế này:

var avg = (grades/grades.length) * grades.length 
console.log(avg) 

Tuy nhiên điều này đã cho tôi một đầu ra của NaN.

Vì vậy, sau đó tôi đã cố gắng này:

for (var i = 0; i < grades.length; i ++){ 
    var avg = (grades[i]/grades.length) * grades.length 
} 
console.log(avg) 

này đã cho tôi một đầu ra của 68. (Tôi không chắc chắn lý do tại sao).

Vì vậy, với điều này tôi có hai câu hỏi. 1. Tại sao đầu ra của tôi 68? và 2. Ai đó có thể giúp tôi với thực sự tìm kiếm trung bình của một mảng?

Trả lời

23

Bạn tính trung bình bằng cách thêm tất cả các phần tử và sau đó chia cho số phần tử.

var total = 0; 
for(var i = 0; i < grades.length; i++) { 
    total += grades[i]; 
} 
var avg = total/grades.length; 

Lý do bạn nhận được 68 vì kết quả là bạn giữ ghi đè giá trị trung bình, vì vậy giá trị cuối cùng sẽ là kết quả của phép tính cuối cùng của bạn. Và phân chia và nhân của bạn bởi lớp.length hủy bỏ lẫn nhau.

Cập nhật: thêm ; trong ví dụ mã cuối cùng để tránh lỗi.

16

Đối với phần thứ hai của câu hỏi của bạn, bạn có thể sử dụng reduce để hiệu quả tốt ở đây:

function getAvg(grades) { 
    return grades.reduce(function (p, c) { 
    return p + c; 
    })/grades.length; 
} 

getAvg(grades); // 81.6 

DEMO

Những câu trả lời khác đã đưa ra cái nhìn sâu sắc tốt vào lý do tại sao bạn nhận được 68, vì vậy tôi sẽ không lặp lại nó ở đây.

3
var total = 0 
grades.forEach(function (grade) { 
    total += grade   
}); 
console.log(total/grades.length) 
+0

Mã này không hoạt động. Ví dụ, sử dụng 'gradeTotal' ở đâu? – Drakes

+0

Rất tiếc! Có một chút điên rồ với backspace trước đó;) –

0

câu trả lời cho câu hỏi của bạn 1.:

for (var i = 0; i < grades.length; i ++){ 
    var avg = (grades[i]/grades.length) * grades.length 
} 

avg được khai báo trong mỗi vòng lặp. Như vậy, ở phần cuối của vòng lặp, avg có giá trị của mục cuối cùng trong mảng: 68 * 5/5

6

Không xây dựng trong chức năng, nhưng bạn có thể sử dụng điều này để có được số tiền,

Array.prototype.sum = function() { 
    return this.reduce(function(a,b){return a+b;}); 
}; 

sau đó chia cho chiều dài mảng, ví dụ:

var arr = [1,2,3,4,5] 
console.log(arr.sum()/arr.length) 
0

Bạn có thể sử dụng bản đồ/giảm chức năng của javascript để tìm trung bình. Giảm sẽ tổng hợp chúng, và bản đồ sẽ tìm thấy trung bình.

var avg = grades.map((c, i, arr) => c/arr.length).reduce((p, c) => c + p); 
3

Có thể thực hiện đơn giản chỉ bằng một thao tác giảm như sau;

var avg = [1,2,3,4].reduce((p,c,_,a) => p + c/a.length,0); 
 
console.log(avg)

1

Viết hàm cho trung bình cho mình là điên. Đó là lý do tại sao mô-đun tồn tại. Tôi thấy math.js

Trong tập tin HTML của tôi:

<script src="http://cdnjs.cloudflare.com/ajax/libs/mathjs/3.2.1/math.min.js"></script> 

(hoặc bạn có thể tải nó)

Trong mã JS của tôi:

math.mean([1,2,3]) // =2 
math.mean(1,2,3) // the same 
math.mean(grades) 
+0

Bao gồm thư viện 1,57MB cho một lớp lót đơn giản là điên – Lauri

6

Với ES6 bạn có thể biến giải pháp của Andy vào dưới dạng một lớp lót:

let average = (array) => array.reduce((a, b) => a + b)/array.length; 
 
console.log(average([1,2,3,4,5]));

6

Cách MacGyver, chỉ dành riêng cho lulz

var a = [80, 77, 88, 95, 68]; 
 

 
console.log(eval(a.join('+'))/a.length)

+5

'Chỉ cho lulz' bảo vệ bạn khỏi downvotes lớn :) –

1

Chức năng trung bình bạn có thể làm là:

const getAverage = (arr) => arr.reduce((p, c) => p + c, 0)/arr.length 

Ngoài ra, tôi cho rằng sử dụng công cụ mã nguồn mở popoular, ví dụ: Lodash:

const _ = require('lodash') 
const getAverage = (arr) => _.chain(arr) 
.sum() 
.divide(arr.length) 
.round(1) 
.value() 
3

Một lót challange chấp nhận

const average = arr => arr.reduce((sume, el) => sume + el, 0)/arr.length;

và sau đó

average([1,2,3,4]); // 2.5

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