【问题标题】:hw can i compare two perl hashes (keys and values) extract difference and apply to a hash in javascripthw 我可以比较两个 perl 哈希(键和值)提取差异并应用于 javascript 中的哈希
【发布时间】:2012-06-01 03:21:00
【问题描述】:

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

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

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

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

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

我看过 Data::Compare 之类的东西,但它似乎只是告诉我哈希是否不同,而不是区别是什么(除非我读错了?)。

【问题讨论】:

    标签: javascript json perl hash compare


    【解决方案1】:

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

    其中一个可能的 delta 有效负载可能是:

    {
      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: {
        },
        ...
      }
    }
    

    【讨论】:

      【解决方案2】:

      我为类似的问题开发了类似的解决方案..

      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

      【讨论】:

      • 也是一个很好的建议。我也要试试这个,看看哪一个最适合我们。我会回来报告的。
      • 顺便说一句,您在客户端做了什么来将差异应用于哈希的客户端副本?
      • 这实际上是为了在 Perl 应用程序之间移动数据,但我认为我没有进入“应用”阶段..
      猜你喜欢
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      相关资源
      最近更新 更多