如何正确构建多维 update-object/array 并将其修补到现有的多维对象上? (javascript)
How to properly build a multi-dimensional update-object/array and patch it over an existing multi-dimensional object? (javascript)
我有两个应用程序,第一个从内存中读取数据,然后将此数据发送给第二个应用程序,第二个应用程序始终持有一个包含最新数据的对象。
目前,我读取了应用程序 1 中的所有数据并将完整的 json 对象发送到应用程序 2。为了提高效率,我只想发送已更新的内容,然后在应用程序 2 中发送, 应用这些更改。
周末我尝试了好几件事,但我无法决定如何正确地去做。
现在,在从内存中读取数据时(每 30 毫秒使用一个函数 运行),我会检查这些值是否与读取它们之前的值不同。如果是这样,将它们放入更新对象或数组中。
目前看起来像这样:
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。另请注意:数据是对象的对象,而不仅仅是普通对象。
您可以使用jsondiffpatch来get/apply两个状态的增量。
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>
您可以只使用 .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 }
我有两个应用程序,第一个从内存中读取数据,然后将此数据发送给第二个应用程序,第二个应用程序始终持有一个包含最新数据的对象。
目前,我读取了应用程序 1 中的所有数据并将完整的 json 对象发送到应用程序 2。为了提高效率,我只想发送已更新的内容,然后在应用程序 2 中发送, 应用这些更改。
周末我尝试了好几件事,但我无法决定如何正确地去做。
现在,在从内存中读取数据时(每 30 毫秒使用一个函数 运行),我会检查这些值是否与读取它们之前的值不同。如果是这样,将它们放入更新对象或数组中。
目前看起来像这样:
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。另请注意:数据是对象的对象,而不仅仅是普通对象。
您可以使用jsondiffpatch来get/apply两个状态的增量。
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>
您可以只使用 .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 }