如何获得两个相似的javascript对象的差异

时间:2019-06-23 14:41:04

标签: javascript object

我正在制作一个使用socket.io的node.js游戏。我只想发送玩家的更新位置以减少滞后量,而不是不断发送游戏中所有玩家的位置。

我已经考虑了很长时间,但是我仍然没有弄清楚该怎么做。

var oldPositions = {x: 10, y: 50};
var newPosotions = {x: 10, y: 20};

var positionUpdate = myFunction(oldPositions, newPositions);

//so positionUpdate should equal {y: 20}

我想创建一个将返回

的函数
{y: 20}

根据我的示例代码。

3 个答案:

答案 0 :(得分:0)

您可以按照以下步骤进行操作:

  • 使用newPositions获取Object.entries的条目。
  • filter()条目,以删除两个对象的值相同的条目。
  • 使用Object.fromEntries
  • 将条目转换为对象

var oldPositions = {x: 10, y: 50};
var newPositions = {x: 10, y: 20};

const myFunction = (a,b) => Object.fromEntries(Object.entries(b).filter(([k,v]) => v !== a[k])) 

var positionUpdate = myFunction(oldPositions, newPositions);
console.log(positionUpdate)

  

k,v是什么意思?

k表示我们正在迭代的当前密钥,而v表示相应的值。这是第二个对象。

实际上,数组的条目类似于

[[key1, value1], [key2, value2]...]

现在,当我们在条目上应用filter()时,每个元素都是数组[key, value]。该代码正在使用Destructuring assignment

答案 1 :(得分:0)

尝试一下:

var oldPositions = {x: 10, y: 50};
var newPositions = {x: 10, y: 20}

const positionUpdate = (oldPositions, newPositions) =>
       Object.keys(newPositions)
         .filter(key => oldPositions[key] !== newPositions[key])
         .reduce((acc, ele) => (acc[ele] = newPositions[ele], acc),{});

console.log(positionUpdate(oldPositions, newPositions))

答案 2 :(得分:0)

定义如下函数:

function myFunction(oldPosition, newPosition){
   if(oldPosition.x != newPosition.x){
     newX = oldPosition.x - newPosition.x; //if negative just transform in positive 
   }else{
     newX = newPosition.x;
  }
   if(oldPosition.y != newPosition.y){
     newY = oldPosition.y - newPosition.y; //if negative just transform in positive 
   }else{
     newY = newPosition.y;
  }
  movement= {
             x=newX,
             y=newY
            };

 return movement;
}