繁体   English   中英

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

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

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

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

我相信,通过最少的编码和测试,对发送的数据量产生最大差异的方法是仅将更改发送到每次更新的哈希。

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

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

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

我有同样的问题,从服务器到客户端发送对象差异(JSON格式)的频率有些高。 我们提出的解决方案非常简单。 由于没有官方或标准的方式来表达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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM