如何正确构建多维 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 }