合并散列数组中的散列属性

时间:2018-04-20 13:28:21

标签: arrays perl loops object

我正在解析excel电子表格并尝试在表和文件中按ID组合数据行。这是我所拥有的简化版本。使用PHP / JS背景,我更喜欢将哈希概念化为对象,因此%aoo表示对象数组而不是哈希数组...

#!/usr/bin/env perl

use v5.10.0;
use strict;
use warnings;

use Data::Dump;
use Data::Dumper;

# Array of objects
# Each object is a row from a table
my $aoo1 = [
    {
        "id"    => 1,
        "name"  => "Dan",
        "team"  => "red"
    },
    {
        "id"    => 2,
        "name"  => "Arnold",
        "team"  => "red"
    },
    {
        "id"    => 3,
        "name"  => "Kristen",
        "team"  => "red"
    }
];
my @aoo2 = (
    {
        "id"    => 1,
        "position"  => "web developer",
    },
    {
        "id"    => 2,
        "position"  => "CEO",
    },
    {
        "id"    => 3,
        "position"  => "Secretary",
    }
);
my @aoo3 = (
    {
        "id"    => 1,
        "tenure"  => "1yr",
    },
    {
        "id"    => 2,
        "tenure"  => "25yr",
    },
    {
        "id"    => 3,
        "tenure"  => "5yr",
    }
);

# object of arrays
# each property is a table name from spreadsheet
my %ooa;
%ooa = (
    "People List" => $aoo1,
    "Position List" => \@aoo2,
    "Tenure List" => \@aoo3
);

# dd \%ooa;

while (my ($list_name, $aoo) = each %ooa)
{
    # $aoo reftype is array | [ %object, %object, %object ]
    # Do something to look into other objects for same id...
}

我希望能够为文件中的每个唯一行创建一个新对象,因此我可以过滤这些值,然后将其写入CSV文件。

实施例。最终结果

%complete_row = (
    'id' => 1,
    'name' => 'Dan',
    'team' => 'red',
    'position => 'Web Dev',
    'tenure' => '1yr'
);

2 个答案:

答案 0 :(得分:0)

将第2个和第3个数组放入哈希,将ID映射到哈希。然后遍历人员并使用ID从位置和任期哈希中获取数据。

use strict;
use warnings;

use Data::Dumper;

my $people = [
    {
        id    => 1,
        name  => "Dan",
        team  => "red"
    },
    {
        id    => 2,
        name  => "Arnold",
        team  => "red"
    },
    {
        id    => 3,
        name  => "Kristen",
        team  => "red"
    }
];

my $positions = [
    {
        id => 1,
        position => "web developer",
    },
    {
        id => 2,
        position => "CEO",
    },
    {
        id => 3,
        position => "Secretary",
    }
];

my $tenures = [
    {
        id => 1,
        tenure => "1yr",
    },
    {
        id => 2,
        tenure => "25yr",
    },
    {
        id => 3,
        tenure => "5yr",
    }
];

# hash each by ID
my %position_hash = map { $_->{id} => $_ } @$positions;
my %tenure_hash   = map { $_->{id} => $_ } @$tenures;

# combine
my $complete = [];
foreach my $person (@$people) {
    my $id = $person->{id};
    my $complete_row = {
        %$person,
        position => $position_hash{$id}->{position},
        tenure => $tenure_hash{$id}->{tenure},
    };
    push @$complete, $complete_row
}
print "complete = " . Dumper($complete);

答案 1 :(得分:-1)

这应该有效:

my %newHash;
foreach my $arrRef(map {$ooa{$_}} keys %ooa) { #reading all values of ooa hash, each value is an array ref
    foreach my $hashRef(@$arrRef) { #reading each array element, each array element is a hash ref 
        foreach my $key(keys %{$hashRef}) { #reading all keys of each internal hash
            $newHash{$hashRef->{'id'}}{$key} = $hashRef->{$key}; #building new hash of hashes with id as key and value as hash ref
        }
    }
}
my @newArray = map {$newHash{$_}} keys %newHash; #converting hash of hashes into array of hashes