我有两个应用程序,第一个从内存中读取数据,然后将这些数据发送到第二个应用程序,该应用程序始终保存带有最新数据的对象。
目前,我读取了应用程序1中的所有数据,并将完整的json对象发送到应用程序2.为了提高效率,我只想发送已更新的内容,然后在应用程序2中应用这些更改
我周末尝试了各种各样的东西,但我无法决定如何正确地做到这一点。
现在,在从内存中读取数据时(每隔30ms运行一次),我会在读取之前检查这些值是否与它们不同。如果是这样,请将它们放入更新对象或数组中。
目前看起来像这样:
let globalData = {};
let updateList = {};
function readThingsFromMemory() {
updateList = {};
for ( ... ) {
[read memory]
setData(... , ..., ...);
}
}
function setData(...1, ...2, ...3) {
if (globalData[...1][...2] != ...3) {
if (updateList[...1] === undefined) {
updateList[...1] = {};
}
updateList[...1][...2] = ...3;
}
globalData[...1][...2] = ...3;
}
setInterval(() => {
readThingsFromMemory();
// Send updateList to application 2 if updateList != empty
}, 30);
在我看来,这似乎是一种奇怪的方式,我觉得这可能会更清洁,甚至更容易。
首先,从readThingsFromMemory()创建一个globalData对象,然后循环遍历该对象并确定差异,这是不是一个好主意?或者在阅读内存时这样做会更好吗?
附注:使用memoryjs从内存中读取并使用websockets将数据发送到应用程序2.另请注意:数据是对象的对象,而不仅仅是普通对象。
答案 0 :(得分:2)
您可以使用jsondiffpatch来获取/应用两种状态的增量。
const prevGrades = [{ name: "Sam", grade: 84 }, { name: "Jack", grade: 93 }, { name: "Will", grade: 64 }, { name: "Ron", grade: 82 }, { name: "Sara", grade: 95 }, { name: "Martha", grade: 71 }];
const currentGrades = [{ name: "Sam", grade: 84 }, { name: "Jack", grade: 93 }, { name: "Oscar", grade: 74 }, { name: "Ron", grade: 82 }, { name: "Sara", grade: 95 }, { name: "Martha", grade: 71 }];
const delta = jsondiffpatch.diff(prevGrades, currentGrades);
console.log("delta:", delta);
const lastSavedState = [{ name: "Sam", grade: 84 }, { name: "Jack", grade: 93 }, { name: "Will", grade: 64 }, { name: "Ron", grade: 82 }, { name: "Sara", grade: 95 }, { name: "Martha", grade: 71 }];
const updatedState = jsondiffpatch.patch(lastSavedState, delta);
console.log("updatedState: ", updatedState);

<script src="https://cdnjs.cloudflare.com/ajax/libs/jsondiffpatch/0.2.5/jsondiffpatch-full.min.js"></script>
&#13;
答案 1 :(得分:0)
您可以使用.filter
查找更改。请记住,基于值的相等只适用于原语。
const memoryData = {
a: 10,
b: 12
}
const globalData = {
a: 11,
b: 12
}
//find only differences in app 1
const changedEntries = Object.entries(memoryData).filter(([key, val]) => {
return globalData[key] !== memoryData[key]
})
console.log(changedEntries) //[ [ 'a', 10 ] ]
//send changedEntries to app 2 and patch over global data
const = changedEntries.forEach(([key, val]) => {
globalData[key] = val
})
console.log(globalData) //{ a: 10, b: 12 }