我是Javascript和JSON对象的新手,并且是我第一次涉足Node.Js.
我遇到了一个问题,我的解决方案工作得很好,但它看起来非常像黑客而且非常低效。我想知道是否有更好的方法来做到这一点。
我有两个来自MongoDB的JSON对象数组。
活动数组
[{"_id":"538599d44ec097f59aa9f49d", "type":"A", "value":0.5},
{"_id":"538599d44ec097f59aa9f49e", "type":"A", "value":0.25},
{"_id":"538599d44ec097f59aa9f49f", "type":"B", "value":1.0},
{"_id":"538599d44ec097f59aa9f4a0", "type":"B", "value":0.5}]
交易计数数组
[{"_id":"538599d44ec097f59aa9f4a0", "total":3},
{"_id":"538599d44ec097f59aa9f49e", "total":6,
{"_id":"538599d44ec097f59aa9f49d", "total":2,]
现在基本上我想从活动数组中获取每个项目的所有信息,并从事务计数数组中查找匹配的总数。如果总计为0,则事务计数数组将不具有该_id的条目。
期望的结果:
[{"_id":"538599d44ec097f59aa9f49d", "type":"A", "value":0.5, "total":2},
{"_id":"538599d44ec097f59aa9f49e", "type":"A", "value":0.25, "total":6},
{"_id":"538599d44ec097f59aa9f49f", "type":"B", "value":1.0, "total":0},
{"_id":"538599d44ec097f59aa9f4a0", "type":"B", "value":0.5, "total":3}]
我会在SQL中使用从活动到事务的左连接在5秒内执行此操作,但无法弄清楚如何在MongoDb中有效地模拟它,所以在应用程序中这样做。这就是我目前正在做的事情:
var results = [];
for (i=0; i<data.activities.length;i++) {
var item_count = 0;
for (j=0; j<data.txns.length;j++) {
if (data.activities[i]._id === data.txns[j]._id) {
item_count = data.txns[j].total;
}
}
var new_json = data.activities[i];
new_json.item_count = item_count;
results.push(new_json);
}
因此,这成功地为我提供了包含JSON对象数组的结果变量,每个对象现在都包含活动详细信息和该活动的相应事务总数。
更便宜的方法似乎是将嵌套内部化,首先遍历事务数组,并为每个事务对象找到相应的活动详细信息。但是,对于像这样的循环嵌套看起来似乎是“错误的”似乎应该是通过id从一组数据到另一组数据的简单查找。
提前致谢。
亚伦
答案 0 :(得分:1)
这是一种不同的,可能更易读的方式来做你想要的事情:
var extend = function(x, y) {
Object.keys(y).forEach(function(k){x[k] = y[k]});
return x;
};
var result = activities.map(function(a) {
return extend(a, transactions.filter(function(t) {
return t._id == a._id;
})[0]);
});
如果是,则事务计数数组不会有该_id的条目 总数为0.
根据您所需输出的外观,我不确定我理解您的意思,但您可以在过滤器中添加一个简单的测试:
if (!t.total) return;
答案 1 :(得分:0)
纯粹来自算法效率pov,你可以受益,首先是你找到正确的_id键时没有完成内循环,其次是不重复迭代你知道已经匹配的对象。这会将算法的运行时间缩短4倍。
例如(标记为注释,因为我的js生锈,这是伪代码);
var results = [];
for (i=0; i<data.activities.length;i++) {
var item_count = 0;
for (j=0; j<data.txns.length;j++) {
if (data.activities[i]._id === data.txns[j]._id) {
item_count = data.txns[j].total;
// data.txns.remove(i);
// break;
}
}
var new_json = data.activities[i];
new_json.item_count = item_count;
results.push(new_json);
}