Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re^3: How to merge two arrays within the hash of arrays based on unique name.

by Sami_R (Sexton)
on Jul 16, 2020 at 18:38 UTC ( [id://11119423]=note: print w/replies, xml ) Need Help??


in reply to Re^2: How to merge two arrays within the hash of arrays based on unique name.
in thread How to merge two arrays within the hash of arrays based on unique name.

Hi Rolf, your code works charm, thank you so much. Finding difficult to understand the code, please add the comment especially for the copied code lines below, would be very helpful.

my $target = \ $tmp{$record->{name}}; $$target->{name} = $record->{name}; $$target->{_order} //= $order++; delete $_->{_order} for @new_sorted_data;

Thanks again.

  • Comment on Re^3: How to merge two arrays within the hash of arrays based on unique name.
  • Download Code

Replies are listed 'Best First'.
Re^4: How to merge two arrays within the hash of arrays based on unique name.
by LanX (Saint) on Jul 16, 2020 at 18:51 UTC
    I simplified the code and added comments. HTH!

    use strict; use warnings; use Data::Dump qw/pp dd/; # --- input data my @sorted_data = ( { 'count_payment' => '', 'count_banking' => '31 (62.00)', 'name' => 'Parking Eye [LTD] One', }, { 'count_payment' => '10 (144.00)', 'count_banking' => '', 'name' => 'Parking Eye [LTD] Two', }, { 'count_payment' => '2 (80.42)', 'count_banking' => '', 'name' => 'Parking Eye [LTD] Three', }, { 'count_payment' => '', 'count_banking' => '4 (982.00)', 'name' => 'Parking Eye [LTD] Two', } ); # --- join elements into temporary hash by name my %tmp_hash; my $order = 0; for my $record (@sorted_data) { my $name = $record->{name}; # create new hash only if $name unknown $tmp_hash{$name} //= { name => $name, _order => $order++, # preserve original order }; # concat other elements for (qw/count_banking count_payment/) { $tmp_hash{$name}{$_} .= $record->{$_}; } } # --- copy hash values by order my @new_sorted_data = sort { $a->{_order} <=> $b->{_order} } values %tmp_hash; # --- discard temporary _order element delete $_->{_order} for @new_sorted_data; # --- dump result pp \@new_sorted_data;

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

      Here a cleaner and more generalized version, also closer to Schwartzian transform

      use strict; use warnings; use Data::Dump qw/pp dd/; # --- input data my @sorted_data = ( { 'count_payment' => '', 'count_banking' => '31 (62.00)', 'name' => 'Parking Eye [LTD] One', }, { 'count_payment' => '10 (144.00)', 'count_banking' => '', 'name' => 'Parking Eye [LTD] Two', }, { 'count_payment' => '2 (80.42)', 'count_banking' => '', 'name' => 'Parking Eye [LTD] Three', }, { 'count_payment' => '', 'count_banking' => '4 (982.00)', 'name' => 'Parking Eye [LTD] Two', } ); # --- join elements into temporary hash by name my %by_name; my $order = 0; for my $record (@sorted_data) { my $name = $record->{name}; # create new hash only if $name unknown $by_name{$name} //= { hsh => { name => $name }, ord => $order++, # preserve original order }; # concat other elements for my $field ( keys %$record ) { next if $field eq 'name'; $by_name{$name}{hsh}{$field} .= $record->{$field}; } } # --- copy hash values by order (Schwartzian transform) my @new_sorted_data = map { $_->{hsh} } sort { $a->{ord} <=> $b->{ord} } values %by_name; # --- dump result pp \@new_sorted_data;

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

        Thank you so much Rolf. Thank you so much for the great support provided.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11119423]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (4)
As of 2024-04-25 07:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found