Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

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 ( [id://11119425]=note: print w/replies, xml ) Need Help??


in reply to Re^3: 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.

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

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

Replies are listed 'Best First'.
Re^5: How to merge two arrays within the hash of arrays based on unique name.
by LanX (Saint) on Jul 16, 2020 at 21:36 UTC
    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.

        It was a fun problem, but next time you have to show more effort, please.

        The code you've shown in the OP was a sham.

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

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (9)
As of 2024-04-19 09:09 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found