我对 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 从一组数据到另一组数据的简单查找的东西来说,嵌套这样的 for 循环似乎仍然是“错误的”。
提前致谢。
亚伦
最佳答案
这是一种不同的,也许更易读的方式来完成你想要的事情:
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]);
});
The transaction counts array won't have an entry for that _id if the total is 0.
根据您想要的输出的外观,我不确定我是否理解您的意思,但您可以在过滤器内添加一个简单的测试:
if (!t.total) return;
关于javascript - Node.js/Javascript 在 JSON 对象数组中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24052118/