如何正确构建多维更新对象/数组并在现有的多维对象上进行修补? (JavaScript的)

时间:2017-10-23 06:42:31

标签: javascript arrays diff javascript-objects

我有两个应用程序,第一个从内存中读取数据,然后将这些数据发送到第二个应用程序,该应用程序始终保存带有最新数据的对象。

目前,我读取了应用程序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.另请注意:数据是对象的对象,而不仅仅是普通对象。

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;
&#13;
&#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 }