我可以比较两个Perl哈希(键和值)提取差异并应用于JavaScript中的哈希吗?

hw can i compare two perl hashes (keys and values) extract difference and apply to a hash in javascript

本文关键字:应用于 JavaScript 哈希吗 键和值 比较 两个 Perl 我可以 哈希 提取      更新时间:2023-09-26

警告,我希望我问的是正确的问题,请随时提出替代方案。

情况;我有一个主要用javascript编写的网站,可以在固定和移动设备上运行。 该网站数据量很大。 它映射移动对象和其他交互的负载。每个客户端每隔几秒钟就会从服务器接收一次数据更新,因此,我需要尽量减少发送的数据量。 目前,服务器发送一个相当大的哈希值,其中包含每次更新时所有对象的当前状态。 这是非常低效的,因为大部分数据保持不变。

我相信,对发送的数据量产生最大影响、编码和测试最少的方法是仅在每次更新时将更改发送到哈希。

所以,我想知道是否有任何经过尝试和测试的方法可以将上次发送的数据(哈希)与将要发送的数据(哈希)进行比较,提取差异,然后将差异应用于 javascript 端的哈希? 我希望这是有道理的?

当我说比较时,我指的是键和值。 目前,哈希没有以任何特定方式排序,但是如果需要,这不是问题。

我看过像 Data::Compare 这样的东西,但它似乎只是告诉我哈希值是否不同,而不是差异是什么(除非我读错了?

我在以

较高的频率从服务器发送到客户端时遇到了同样的问题。我们想出的解决方案非常简单。由于没有官方或标准的方式来表达json对象之间的差异,因此我们提出了自己的协议来定义添加哪些对象,哪些对象是更新的(即这些对象的属性被更改(添加/更新/删除)以及哪些对象被完全删除。

可能的增量有效负载之一可能是:

{
  added: [
    /* array of new objects */
  ],
  removed: [
    /* array of object identifiers that need to be removed */
  ],
  updated: { /* key value pairs of object identifiers with their property maps */
    obj_id_01: {
      updated: { /* key-value pairs of updated properties */ },
      removed: [ /* array of keys of removed properties in an object */ ]
    },
    obj_id_02: {
    },
    ...
  }
}

我为类似的问题开发了一个类似的解决方案。

my $bef = {
  name => 'Fred',
  wife => 'Wilma',
  hobby => 'Breaking Rocks',
  friends => [qw! Barney Wilma Betty !],
};
my $aft = { 
  name => 'Fred',
  pet => 'Dino',
  hobby => 'Bowling',
  friends => [qw! Barney Betty Dino !],
  kids => [qw! Bam Pebbles !],
};
my $differ = Lecstor::FeedProxy::Diff->new;
my $diff = $diff->differences($bef, $aft);
$diff: {
  'pet' => 'Dino',
  'wife' => undef,
  'hobby' => 'Bowling',
  'friends' => {
    'remove' => [ 'Wilma' ],
    'add' => [ 'Dino' ]
  },
  'kids' => {
    'add' => [ 'Bam', 'Pebbles' ]
  }
};

https://github.com/lecstor/Lecstor/blob/master/lib/Lecstor/FeedProxy/Diff.pm