簡體   English   中英

在JSON對象數組中搜索Node.js / Javascript

[英]Node.js/Javascript searching in arrays of JSON objects

我對Javascript和JSON對象非常陌生,並且首次涉足Node.Js。

我有一個問題,我的解決方案可以很好地解決問題,但看起來非常像hack,效率很低。 我想知道是否有更好的方法可以做到這一點。

我有兩個來自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從一組數據到另一組數據的簡單查找。

提前致謝。

亞倫

這是一種不同的,也許更易讀的方式來做您想要的事情:

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,則交易計數數組將沒有該_id的條目。

通過所需輸出的外觀,我不確定我是否理解您的意思,但是您可以在過濾器中添加一個簡單的測試:

if (!t.total) return;

純粹從算法效率的角度來看,您可以從中受益,首先是在找到正確的_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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM