Проверяйте значения хешей перед отправкой в ​​массив в perl - PullRequest
0 голосов
/ 20 марта 2019

Для создания файла Json я помещаю хэши в массив, но значения дублируются, и я не хочу добавлять те хэши, которые уже есть в массиве.

foreach my $corp_id(@{corpId}) {
    foreach my $rcode(@{$brands_map->{$corp_id->{s_brand}}}) {
            my corpIdAccessCode;
            $corpIdAccessCode->{accessCode} = $corp_id->{s_id};
            $corpIdAccessCode->{corporateId} = $corp_id->{c_id};
            $corpIdAccessCode->{bcode} = $rcode;
            push @{$accessCode_array} ,$corpIdAccessCode; **// Here before pushing to array i want to have a check wheather $corp_id->{s_id}, $corp_id->{c_id} and  $rcode already exists or not in the accessCode_array**
    }
}

приведенный ниже массив хэшей, я не хочу дублировать их

[
      {
        "accessCode": "NQ",
        "bcode": "PD",
        "corporateId": "12"
      },
      {
        "accessCode": "NQ",
        "bcode": "CI",
        "corporateId": "2122121"
      },
      {
        "accessCode": "NQ",
        "bcode": "CI",
        "corporateId": "2122121"
      },
      {
        "accessCode": "CD",
        "bcode": "PD",
        "corporateId": "12"
      },

Окончательный вывод из изменений кода должен дать результат, подобный приведенному ниже:

[
      {
        "accessCode": "NQ",
        "bcode": "PD",
        "corporateId": "12"
      },
      {
        "accessCode": "NQ",
        "bcode": "CI",
        "corporateId": "2122121"
      },

      {
        "accessCode": "CD",
        "bcode": "PD",
        "corporateId": "12"
      },

Или есть ли способ, которым мыможет удалить дубликаты хэшей из массива.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Было бы неэффективно проверять весь массив перед отправкой или удалением дубликатов впоследствии. Поэтому вам необходимо отслеживать, какие данные вы уже нажали:

my $seen;
foreach my $corp_id(@{corpId}) {
    foreach my $rcode(@{$brands_map->{$corp_id->{s_brand}}}) {
            my ($k1, $k2, $k3) = ($corp_id->{s_id}, $corp_id->{c_id}, $rcode);
            if ($seen->{$k1}->{$k2}->{$k3}) {
                next;
            }
            $seen->{$k1}->{$k2}->{$k3} = 1;

            my $corpIdAccessCode;
            $corpIdAccessCode->{accessCode} = $corp_id->{s_id};
            $corpIdAccessCode->{corporateId} = $corp_id->{c_id};
            $corpIdAccessCode->{bcode} = $rcode;
            push @{$accessCode_array} ,$corpIdAccessCode; **// Here before pushing to array i want to have a check wheather $corp_id->{s_id}, $corp_id->{c_id} and  $rcode already exists or not in the accessCode_array**
    }
}

my ($k1, $k2, $k3) только для того, чтобы сделать его короче и более читабельным.

0 голосов
/ 20 марта 2019

Проверка !$seen{$key}++ является распространенным способом идентификации первого из дубликатов.Например,

my %seen;
my @uniques = grep { !$seen{$_}++ } @items;

Это можно развернуть в цикл foreach.

my %seen;
for my $corp_id (@corpId) {
    for my $rcode (@{ $brands_map->{ $corp_id->{s_brand} } }) {
        next if $seen{ $corp_id->{s_id} }{ $corp_id->{c_id} }{ $rcode }++;

        push @$accessCode_array, {
            accessCode  => $corp_id->{s_id},
            corporateId => $corp_id->{c_id},
            bcode       => $rcode,
        };
    }
}

Для экономии памяти вы можете даже заменить

next if $seen{ $corp_id->{s_id} }{ $corp_id->{c_id} }{ $rcode }++;

на

next if $seen{ join ":", $corp_id->{s_id}, $corp_id->{c_id}, $rcode }++;

, но предполагается, что ни одно из трех полей не может содержать :.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...