Node.js / Javascript在JSON对象数组中搜索

时间:2014-06-05 05:17:11

标签: javascript json node.js

我是Javascript和JSON对象的新手,并且是我第一次涉足Node.Js.

我遇到了一个问题,我的解决方案工作得很好,但它看起来非常像黑客而且非常低效。我想知道是否有更好的方法来做到这一点。

我有两个来自MongoDB的JSON对象数组。

  1. 活动数组

    [{"_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}]
    
  2. 交易计数数组

    [{"_id":"538599d44ec097f59aa9f4a0", "total":3},
     {"_id":"538599d44ec097f59aa9f49e", "total":6,
     {"_id":"538599d44ec097f59aa9f49d", "total":2,]
    
  3. 现在基本上我想从活动数组中获取每个项目的所有信息,并从事务计数数组中查找匹配的总数。如果总计为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从一组数据到另一组数据的简单查找。

    提前致谢。

    亚伦

2 个答案:

答案 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);
    }