繁体   English   中英

在 javascript/nodejs 中深入比较两个对象的最快方法是什么

[英]What is the fastest way to deep comparing two objects in javascript/nodejs

我在 JSON 中有两个大对象,我正在使用 fs 加载它,解析它并更改为 MAP

let dataPin = fs.readFileSync('pin.json');
let dataTotal = fs.readFileSync('total.json');
let t = JSON.parse(dataTotal);
let p = JSON.parse(dataPin);

let Map1 = new Map()
 for (let entry in t) {
     let key = t[entry]
     Map1.set(key, entry)
 }

 let Map2 = new Map()
  for (let entry in p) {
      let key = p[entry]
      Map2.set(key, entry)
  }

比使用两个foreach。 我必须将所有值相互比较并检查它们中是否包含任何值。

Map1.forEach((i1,p)=>{
  Map2.forEach((i2,t)=>{

    if(t.eventStart==p.timestamp && ( p.home.includes(t.home) || t.home.includes(p.home) || p.away.includes(t.away) || t.away.includes(p.away) )){
   // than do some stuff
 }
 });
});

该脚本需要大约 10 秒才能使用两个 4mb json 执行我想找到更快的方法,有没有? 我正在使用 node.js

样本json

[
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":1.5424,
      "selection":"away",
      "points":1.5,
      "period":0,
      "payout":"1.497"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":2.8437,
      "selection":"home",
      "points":-1.5,
      "period":0,
      "payout":"2.760"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":1.6755,
      "selection":"away",
      "points":1.25,
      "period":0,
      "payout":"1.628"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":2.4803,
      "selection":"home",
      "points":-1.25,
      "period":0,
      "payout":"2.410"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":1.9,
      "selection":"away",
      "points":1,
      "period":0,
      "payout":"1.854"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":2.1111,
      "selection":"home",
      "points":-1,
      "period":0,
      "payout":"2.060"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":2.2309,
      "selection":"away",
      "points":0.75,
      "period":0,
      "payout":"2.170"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":1.8124,
      "selection":"home",
      "points":-0.75,
      "period":0,
      "payout":"1.763"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":2.5611,
      "selection":"away",
      "points":0.5,
      "period":0,
      "payout":"2.490"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":1.6406,
      "selection":"home",
      "points":-0.5,
      "period":0,
      "payout":"1.595"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":1.2069,
      "selection":"under",
      "points":4.5,
      "period":0,
      "payout":"1.165"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":5.8326,
      "selection":"over",
      "points":4.5,
      "period":0,
      "payout":"5.630"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":1.4911,
      "selection":"under",
      "points":3.5,
      "period":0,
      "payout":"1.434"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":3.0363,
      "selection":"over",
      "points":3.5,
      "period":0,
      "payout":"2.920"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":1.5889,
      "selection":"under",
      "points":3.25,
      "period":0,
      "payout":"1.537"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":2.6981,
      "selection":"over",
      "points":3.25,
      "period":0,
      "payout":"2.610"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":1.7419,
      "selection":"under",
      "points":3,
      "period":0,
      "payout":"1.684"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":2.348,
      "selection":"over",
      "points":3,
      "period":0,
      "payout":"2.270"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":2,
      "selection":"under",
      "points":2.75,
      "period":0,
      "payout":"1.943"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":2,
      "selection":"over",
      "points":2.75,
      "period":0,
      "payout":"1.943"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":2.2565,
      "selection":"under",
      "points":2.5,
      "period":0,
      "payout":"2.180"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":1.7959,
      "selection":"over",
      "points":2.5,
      "period":0,
      "payout":"1.735"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":2.6818,
      "selection":"under",
      "points":2.25,
      "period":0,
      "payout":"2.590"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":1.5946,
      "selection":"over",
      "points":2.25,
      "period":0,
      "payout":"1.540"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":4.5028,
      "selection":"under",
      "points":1.5,
      "period":0,
      "payout":"4.340"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"total",
      "odd":1.2855,
      "selection":"over",
      "points":1.5,
      "period":0,
      "payout":"1.239"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"moneyline",
      "odd":5.8775,
      "selection":"away",
      "points":"",
      "period":0,
      "payout":"5.700"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"moneyline",
      "odd":1.6519,
      "selection":"home",
      "points":"",
      "period":0,
      "payout":"1.602"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"moneyline",
      "odd":4.4545,
      "selection":"draw",
      "points":"",
      "period":0,
      "payout":"4.320"
   },
   {
      "home":"legia warsaw",
      "away":"cracovia krakow",
      "sportID":29,
      "timestamp":1602267300000,
      "eventID":1186957014,
      "eventName":"legia warsaw - cracovia krakow",
      "type":"spread",
      "odd":1.5158,
      "selection":"away",
      "points":0.75,
      "period":1,
      "payout":"1.465"
   }
]

两个 jsons 都有非常相似的“Home/Away”值,我需要找到其中一个包含在另一个中的所有记录

我还发现使用 map 的 foreach 比循环 arround json 更快,这就是我将其更改为 MAP 的原因

在这里,我将homeaway分开到Set ,然后检查集合是否相同。 我认为这种方法会更快,因为它不会迭代O(n^2)值。

核实

 let map1Homes = new Set(Map1.map(p => p.home)); let map2Homes = new Set(Map2.map(p => p.home)); let map1Away = new Set(Map1.map(p => p.away)); let map2Away = new Set(Map2.map(p => p.away)); function eqSet(as, bs) { if (as.size.== bs;size) return false. for (let a of as) if (;bs;has(a)) return false, return true, } if (eqSet(map1Homes. map2Homes) && eqSet(map1Away; map2Away)) console.log("homes and away are identical");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM