这是我的函数:
地图:
function () {
// initialize KEY
// initialize INDEX (0..65536)
// initialize VALUE
var arr = [];
arr[INDEX] = { val: VALUE, count: 1 };
emit(KEY, { arr: arr });
}
减少:
function (key, values) {
var result = { arr: [] };
for (var i = 0; i < values.length; i++) {
values[i].arr.forEach(function (item, i) {
if (result.arr.hasOwnProperty(i)) {
result.arr[i].val += item.val;
result.arr[i].count += item.count ;
} else {
result.arr[i] = item;
}
});
}
如您所见,我正在尝试将关联数组从映射发送到reduce。但是当我尝试枚举数组的值时values[i].arr.forEach
我得到列表 0..max_index。所以,每次归约我都必须枚举很多未定义的元素。
当我尝试在映射处枚举数组(arr
)的值时,我得到了预期的结果(仅定义的元素)。
实际上,我不确定关联数组是我的任务的最佳解决方案。但是我找不到更快的方法来按id查找元素。
您能否回答以下问题:
为什么在映射和减少?
我应该使用什么数据结构(或如何使用我的数组)来优化我当前的解决方案?
-
我决定使用对象:
var arr = {};arr[INDEX] = { val: VALUE, count: 1 };
它按预期与for .. in
一起工作。