[英]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 的原因
在这里,我将home
和away
分开到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.