Làm thế nào về vấn đề này (có nguồn gốc JS, sẽ không phá vỡ trên các trình duyệt cũ):
function arrayMean(ary) {
var index = {}, i, label, value, result = [[],[]];
for (i = 0; i < ary[0].length; i++) {
label = ary[0][i];
value = ary[1][i];
if (!(label in index)) {
index[label] = {sum: 0, occur: 0};
}
index[label].sum += value;
index[label].occur++;
}
for (i in index) {
if (index.hasOwnProperty(i)) {
result[0].push(parseInt(i, 10));
result[1].push(index[i].occur > 0 ? index[i].sum/index[i].occur : 0);
}
}
return result;
}
FWIW, nếu bạn muốn fancy tôi đã tạo ra một số cách khác để làm điều đó. Chúng phụ thuộc vào các thư viện bên ngoài và rất có thể là một thứ tự độ trễ chậm hơn so với một giải pháp gốc. Nhưng họ là đẹp hơn để xem.
Nó có thể trông như thế này, với underscore.js:
function arrayMeanUnderscore(ary) {
return _.chain(ary[0])
.zip(ary[1])
.groupBy(function (item) { return item[0]; })
.reduce(function(memo, items) {
var values = _.pluck(items, 1),
toSum = function (a, b) { return a + b; };
memo[0].push(items[0][0]);
memo[1].push(_(values).reduce(toSum)/values.length);
return memo;
}, [[], []])
.value();
}
// --------------------------------------------
arrayMeanUnderscore([[3,4,5,3,4,5,2], [12,14,16,11,12,10,20]]);
// -> [[2,3,4,5], [20,11.5,13,13]]
hay như thế này, với thực sự vĩ đại linq.js (v2.2 Tôi đã sử dụng):
function arrayMeanLinq(ary) {
return Enumerable.From(ary[0])
.Zip(ary[1], "[$, $$]")
.GroupBy("$[0]")
.Aggregate([[],[]], function (result, item) {
result[0].push(item.Key());
result[1].push(item.Average("$[1]"));
return result;
});
}
// --------------------------------------------
arrayMeanLinq([[3,4,5,3,4,5,2], [12,14,16,11,12,10,20]]);
// -> [[3,4,5,2], [11.5,13,13,20]]
Như nghi ngờ, việc triển khai "ưa thích" chậm hơn so với triển khai gốc: jsperf comparison.
Cảm ơn bạn! - Man JS không bao giờ thẳng về phía trước ... – Chrugel
một số cải tiến: - Tôi nghĩ rằng nếu thử nghiệm: index.hasOwnProperty (i) là vô dụng. - Tôi nghĩ parseInt là vô ích khi my_array có số. - Để kiểm tra nếu xảy ra là 0, sử dụng câu? thay thế. ocurr == 0? 0: tổng hợp/xảy ra. –
Chỉ cần làm rõ: Cảm ơn tất cả! Tôi chỉ đơn giản là chọn câu trả lời này, b/c nó mang lại cho tôi kết quả đúng/mong đợi 'ra khỏi hộp'. Với giải pháp (rất thanh lịch) từ robertklep & Adrian Maire tôi kết thúc với các chuỗi trong 'nhãn' của tôi, nó không phải là vấn đề, nhưng Tomalak đã đưa ra một giải pháp phù hợp. – Chrugel