Как получить различия двух похожих объектов javascript - PullRequest
0 голосов
/ 23 июня 2019

Я создаю игру для node.js, которая использует socket.io.Вместо того, чтобы постоянно отправлять позиции всем игрокам в игре, я только хочу отправлять обновленные позиции игроков, чтобы уменьшить количество лагов.

Я долго думал об этом, но до сих пор не понял, как это сделать.

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 голосов
/ 23 июня 2019

Попробуйте это:

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))
0 голосов
/ 23 июня 2019

определить функцию следующим образом:

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;
}
0 голосов
/ 23 июня 2019

Вы можете сделать это в следующих шагах:

  • Получить записи 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]. Код использует Разрушающее присвоение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...