Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js/Javascript在JSON对象数组中搜索_Javascript_Json_Node.js - Fatal编程技术网

Node.js/Javascript在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":

我对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,]
    
  • 现在基本上我想从activities数组中获取每个项目的所有信息,并从transaction counts数组中查找匹配的总数。如果总数为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);
        }
    
    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);
        }