javascript - 有没有办法将 reduce 应用于两个数组但不重置调用之间的累加器?
问题描述
所以如果我有一个对象数组:
var synched = [{
name = "something",
value = 11132
}, {
name = "something else",
value = 1231233
}...]
和另一个几乎相同但包含其他一些值的数组:
var opened = [{
name = "something",
value = 1233312
}, {
name = "something else",
value = 12312333
}, {
name = "something",
value = 1241233
}]
我想将它们全部加入到一个对象数组中,在其中计算任一数组中“名称”的准确度总数。
var result = [{
name: "something",
opened: 2,
synched: 1,
total: 3
}, {
name: "something else",
opened: 1,
synched: 1,
total: 2
}]
有没有比多次array.reduce
调用更有效的方法呢?
var data = synched.reduce(function (data, item) {
var key = item.name
var created = (data[key] || (data[key] = {'name': key, 'opened': 0, 'synched': 0, 'total': 0}));
created['synched'] += 1;
created['total'] += 1;
return data;
}, {});
var data1 = opened.reduce(function (data1, item) {
var key = item.name
var created = (data1[key] || (data1[key] = {'name': key, 'opened': 0, 'synched': 0, 'total': 0}));
created['opened'] += 1;
created['total'] += 1;
return data1;
}, {});
Object.keys(data).forEach(function (key) {
if(data1.hasOwnProperty(key)){
data1[key]['synched'] = data[key]['synched'];
data1[key]['total'] = data[key]['total'] + data1[key]['total'];
} else {
data1[key] = data[key];
}
});
var result = Object.keys(data1).map(function(item) { return data1[item]; });
编辑:
按照@Pointy 的建议,我可以这样做:
var data1 = opened.reduce(function (data, item) {
var key = item.name
var created = (data[key] || (data[key] = {'name': key, 'opened': 0, 'synched': 0, 'total': 0}));
created['opened'] += 1;
created['total'] += 1;
return data;
}, data);
这将使我摆脱第三次迭代。谢谢!
解决方案
推荐阅读
- ios - 加速器 ios 构建失败问题
- android - Google Play 发布前报告的辅助功能警告
- javascript - three.js 在双击时动态生成对象
- mysql - MariaDB:唯一索引的 varchar 列大小限制问题
- javascript - 如果 Google API 密钥(在 index.html 中提到)失效,混合 cordova 项目会发生什么?
- php - Wordpress Woocommerce 高级自定义字段 True/False 始终返回 NULL
- entity-framework - 仅在 Azure webapp 中的单个查询的 SQL 连接超时错误
- dialogflow-es - 在对话框流中获取自定义位置或地址时出错
- angular - Angular Reactiveforms 动态数据
- php - 在 opencart 2.0.3 中找到相应 .tpl 文件的控制器文件