关于javascript:两份json数据比较

8次阅读

共计 1733 个字符,预计需要花费 5 分钟才能阅读完成。

前言

有一个工具。
能够在线编辑 geojson 数据。
次要性能是,在线编辑修建,增删改,次要数据是面积和高度。面积由轨迹数组组成。
轨迹数组:features.geometry.coordinates。
高度是:features.properties.Height。
编辑了能够导出成一份 geojson 文件,也可导出成 obj 文件。
明天遇到的问题是,如果我想晓得我编辑了多少个修建,怎么办?

通过

原则上能够在编辑的过程中记录,但这样做不是很好。

  • 曾经改了的文件,没方法重新处理
  • 减少工作量
  • 减少逻辑解决,影响性能

过程

  • 最简略的办法是,间接应用 for 循环,遍历两份数据,如果可能找到雷同的数据,即是未修改,否则批改 +1.
  • 然而这样做有两个问题。
  • 因为精度问题,导入的原始数据和导出的数据,就算没扭转,也会有差别,因为小数点足足有 14 位。
  • 间接循环工夫复杂度是 O(n2)。

怎么办呢?
通过测试,发现两份数据在保留 4 位小数点的时候,是统一的。
所以能够把数据取 4 个小数点。
数据差别的问题曾经解决了。
然而工夫复杂度还没解决。
于是决定用空间换工夫。

算法

用一个对象,把每一个修建的轨迹存储到哈希之中,哈希的值为修建的高度。
如:
features.properties.Height = 9
features.geometry.coordinates = [[[114.35098683912278, 36.13595280429963],[114.35098693920013, 36.13582170962971]]]
则存储为:
let obj = {}
obj[‘114.3509-36.1359-114.3509-36.1358’] = 9
因为不同修建的高度、轨迹不同,所以同一份数据的哈希是惟一的。
第一份数据存储起来,跟第二份数据比拟,记录下不雷同的数据,就能够找到扭转的数据。

备注

为了防止哈希反复,在记录哈希的时候须要做一个反复判断。

附录

import gai from './assets/gai.js'

 import yuan from './assets/yuan.js'

 let gaiobj = {}

 let yuanobj = {}

 for(let i = 0; i < yuan.features.length; i++){let features = yuan.features[i]

 let properties = features.properties

 let geometry = features.geometry

 let coordinates = geometry.coordinates[0]

 let lnglat = coordinates[0]

 let height = Number(properties.Height || properties.height)

 let key = ''

 lnglat.forEach(xy => {let [x, y] = xy

 key += x.toFixed(4) + '-'+ y.toFixed(4) + '-'

 })

 if(yuanobj[key]){console.log('key1', key)

 }

 yuanobj[key] = height

 }

 let change = 0

 for(let i = 0; i < gai.features.length; i++){let features = gai.features[i]

 let properties = features.properties

 let geometry = features.geometry

 let coordinates = geometry.coordinates[0]

 let lnglat = coordinates[0]

 let height = Number(properties.Height || properties.height)

 let key = ''

 lnglat.forEach(xy => {let [x, y] = xy

 key += x.toFixed(4) + '-'+ y.toFixed(4) + '-'

 })

 if(gaiobj[key]){console.log('key2', key)

 }

 gaiobj[key] = height

 if(yuanobj[key] != gaiobj[key]){change ++}

 }

 console.log('曾经扭转了的修建:', change)
正文完
 0