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

标签 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,]
    

现在基本上我想从事件数组中获取每个项目的所有信息,并从交易计数数组中查找匹配的总数。如果总数为 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/

相关文章:

node.js - Mongoose 与 NestJS - 一对多

javascript - 在 deviceReady sencha touch cordova 应用程序中加载 app.js

javascript - 标准协议(protocol)路径的规则是什么?

c++ - libcurl 未初始化的变量 curl 错误

json - jq 将对象键值映射到包含两者的对象数组

node.js - Mongoose - 如何为所有模型创建通用方法?

android - React Native警告: "Setting a timer for a long period of time...". 如何定位原因?

javascript - 访问 Express 路由时加入 socket.IO 房间

javascript - 如果我使用 js style.bottom 移动它,元素 css 动画会重置

json - 从 powershell 中的 JSON 对象中删除一个属性