2015-01-10 41 views
5

Tôi có một mảng với tài sản, lấy sau ví dụ:Sum của thuộc tính đối tượng trong một mảng

var arrayPeople = [ 
    { 
     name: 'joe', 
     job: 'programmer', 
     age: 25, 
    }, 
    { 
     name: 'bob', 
     job: 'plumber', 
     age: 30, 
    }; 
]; 

Tôi muốn tạo ra một chức năng mà sẽ trở lại lứa tuổi trung bình của họ, đây là những gì tôi có nghĩa là hiện không làm việc

var ageAverage = function(array) { 
    var age = 0, average; 
    for (var i = 0; i < array.length; i++) { 
     age += array[i].age; 
    } 
    average = age/array.length; 
    return average; 
}; 

Những gì tôi nhận được khi chạy chức năng này là Not A Number

Nhưng những gì tôi có thể nhận được để làm việc là:

var ageAverage = function(array) { 
    var age = 0, average; 
    for (var i = 0; i < array.length; i++) { 
     age = array[0].age; 
    } 
    average = age/array.length; 
    return average; 
}; 

Sự khác biệt tinh tế ở đây là tôi đã lấy đi + = và chỉ cần thực hiện nó =, và tôi đã lấy đi việc sử dụng các biến của chúng tôi i và chỉ cho nó chỉ mục đầu tiên của mảng. Vì vậy, khi làm điều này, tôi biết rằng hàm này thay thế một cách chính xác mảng tham số với arrayPeople, nhưng có điều gì đó sai trong vòng lặp của tôi, đó là ngăn tôi trở thành 0 và 1 (các chỉ mục của arrayPeople).

P.S. Tôi đang cố gắng làm điều này một mình, và tôi không tìm kiếm ai đó để giải quyết vấn đề cho tôi, tôi thực sự đánh giá cao một số gợi ý về những gì cần sửa chữa hoặc có thể là một khái niệm tôi cần nghiên cứu. vấn đề này.

Cảm ơn !!

+0

Hãy thử chuyển array [i] .age thành một số. Cũng khởi tạo các biến, nó là thực hành tốt. Không sử dụng mảng như một tên của một biến, trong một số ngôn ngữ nó là một từ dành riêng. Ngoài ra kiểm tra mảng của bạn của các đối tượng, có một số sai lầm (dấu phẩy và dấu chấm phẩy) – acontell

Trả lời

4

Bạn cần khởi age biến (var age = 0)

var arrayPeople = [{ 
 
    name: 'joe', 
 
    job: 'programmer', 
 
    age: 25, 
 
}, { 
 
    name: 'bob', 
 
    job: 'plumber', 
 
    age: 30, 
 
}]; 
 

 
var ageAverage = function(array) { 
 
    var age = 0, 
 
     average; 
 

 
    for (var i = 0; i < array.length; i++) { 
 
    age += array[i].age; 
 
    } 
 

 
    average = age/array.length; 
 
    return average; 
 
}; 
 

 
console.log(
 
    ageAverage(arrayPeople) 
 
);

trong biến thể của bạn, age biến bằng undefinedundefined += number (ví dụ 25) trả NaN;

cũng thay đổi ,-; trong dòng này

từ

for (var i = 0, i < array.length; i++) { 

để

for (var i = 0; i < array.length; i++) { 
2

Bạn nên thay đổi cho đến:

for (var i = 0; i < array.length; i ++) thay vì cho (var i = 0, i < mảng.chiều dài; i ++)

và đưa ra giá trị ban đầu cho tuổi

var age=0 
+0

Cảm ơn phản ứng của bạn, đây là một lỗi đánh máy, trong mã thực sự của tôi tôi sử dụng dấu chấm phẩy không phải là dấu phẩy, lỗi của tôi – Brandon

+0

Mã của bạn vẫn không hoạt động tôi có thử nghiệm nó và trả về: 27.5 –

18

Xem xét sử dụng mapreduce:

arrayPeople. 
    map(function(item){ return item.age; }). 
    reduce(function(a, b){ return a + b; }, 0)/arrayPeople.length; 

Hoặc chỉ là reduce như @KooiInc chỉ ra:

arrayPeople.reduce(function (a,b) { return a + b.age; }, 0)/arrayPeople.length; 

một tấm gương làm việc:

var arrayPeople = [{ 
 
    name: 'joe', 
 
    job: 'programmer', 
 
    age: 25, 
 
    }, { 
 
    name: 'bob', 
 
    job: 'plumber', 
 
    age: 30, 
 
    }], 
 
    average = arrayPeople.reduce(function(a, b) { 
 
    return a + b.age; 
 
    }, 0)/arrayPeople.length; 
 

 
document.write(average);

+3

Bạn không cần phần ánh xạ: 'arrayPeople.reduce (hàm (a, b) {return a + + b.age;}, 0);' – KooiInc

+0

Cảm ơn, điều này là mới đối với tôi và tôi đã nghiên cứu nó, một điều tôi không thể tìm thấy mặc dù là làm thế nào để gọi điều này. thế nào tôi có thể lưu trữ điều này trong một biến? Tôi cuối cùng sử dụng giá trị của đầu ra trong một innerHTML sẽ hiển thị số trung bình trên một trang html, vì vậy tôi cần phải có một cái gì đó như: document.getElementById ('htmlid'). InnerHTML = "Trung bình là" + (câu trả lời của chúng tôi cho vấn đề này ở đây); – Brandon

+0

Có, tôi đã thêm một ví dụ làm việc. –

1

Luôn luôn có một lớp lót.

arrayPeople.reduce((a, o, i, p) => a + o.age/p.length, 0)); 

console.log(`${[{ 
 
    name: 'joe', 
 
    job: 'programmer', 
 
    age: 25, 
 
    }, 
 
    { 
 
    name: 'bob', 
 
    job: 'plumber', 
 
    age: 30, 
 
    } 
 
].reduce((a, o, i, p) => a + o.age/p.length, 0)}%`);

+0

Nó không hoạt động. Nó cung cấp cho [Object] [Object] cho 'a' nơi bạn làm một + o.age. Mặc dù tôi đang sử dụng giảm để có được tổng độ tuổi cho tất cả các đối tượng trong mảng, logic là như nhau. Khi tôi đã làm a.age + o.age, nó làm việc, nhưng nó vẫn cho vấn đề khi có một phần tử duy nhất trong mảng. – shanti

+0

Hi @shanti, có lẽ bạn đang truyền một đối tượng như giá trị ban đầu trong phương thức reduce, bạn có thể cung cấp một ví dụ làm việc về mã của bạn không? Nếu a.age hoạt động, bộ tích lũy của bạn (a) là một đối tượng thay vì một số. – Ricky

+1

Đối số đầu tiên trong phương thức giảm là bộ tích lũy, thứ hai là mục hiện tại trong danh sách chi phí. Hãy thử điều này: 'costList.reduce ((totalExpense, currentExpense) => {return totalExpense + currentExpense.amount}, 0)'. Không cần truy cập thuộc tính 'amount' trong' totalExpense' vì đó là kết quả (bộ tích lũy). Hy vọng tôi đã rõ ràng, tôi đang trên điện thoại của tôi. Nếu có bất kỳ nghi ngờ nào cảm thấy tự do để nói với tôi, tôi sẽ lấy lòng của tôi để cung cấp một ví dụ. – Ricky

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