Node.js/Javascript在JSON对象数组中搜索
我对Javascript和JSON对象相当陌生,并且第一次尝试Node.Js 我有一个问题,我的解决方案是完美的工作,但它似乎非常像一个黑客和非常低效。我想知道有没有更好的办法 我有两个来自MongoDB的JSON对象数组Node.js/Javascript在JSON对象数组中搜索,javascript,json,node.js,Javascript,Json,Node.js,我对Javascript和JSON对象相当陌生,并且第一次尝试Node.Js 我有一个问题,我的解决方案是完美的工作,但它似乎非常像一个黑客和非常低效。我想知道有没有更好的办法 我有两个来自MongoDB的JSON对象数组 活动数组 [{"_id":"538599d44ec097f59aa9f49d", "type":"A", "value":0.5}, {"_id":"538599d44ec097f59aa9f49e", "type":"A", "value":0.25}, {"_id":
[{"_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,]
[{"_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);
}
var结果=[];
对于(i=0;i,这里有一种不同的,也许更可读的方法来做你想做的事情:
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]);
});
如果
总数是0
从所需输出的外观来看,我不确定我是否理解您的意思,但您可以在过滤器中添加一个简单的测试:
if (!t.total) return;
纯粹从算法效率的角度来看,您可以从中受益,首先是在找到正确的_id键时不完成内部循环,其次是不重复迭代已知已匹配的对象。这将使算法的运行时间减少4倍
例如(用注释标记,因为我的js生锈了,这是伪代码)
var结果=[];
对于(i=0;iYou实际上可以将SQL与Node一起使用。@elmigranto谢谢,我知道这一点,但我也在努力学习Mongo。到目前为止,我既喜欢又讨厌它!那么你不应该尝试在Mongo中重新创建关系数据库,否则你会受到影响,最终使用Node来完成DB通常所做的事情(这对obv来说是不好的。原因)。我不确定您的数据是关于什么的,但不同集合中的左连接
和相同的\u id
告诉您应该重新考虑其结构方式。谢谢@elclars。基本上,事务对象是事务集合中活动id的聚合计数的结果。因此,如果没有事务对于一个特定的活动,它在我的事务对象中没有条目,但我仍然需要将该活动识别为有0个事务,因此不能因为它不在那里而放弃它。你能解释上面的解决方案在做什么吗?这太离谱了!:-)
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);
}