我对Javascript和JSON对象非常陌生,并首次涉足Node.Js。

我有一个问题,我的解决方案可以很好地解决问题,但看起来非常像hack,效率很低。我想知道是否有更好的方法可以做到这一点。

我有两个来自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从一组数据到另一组数据的简单查找。

提前致谢。

亚伦

最佳答案

这是一种不同的,也许更易读的方式来做您想要的事情:

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;

关于javascript - 在JSON对象数组中搜索Node.js/Javascript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24052118/

10-10 09:01
查看更多