- Красиво собрать массив из глубин JSON, Andrey Mitrofanov, 09:24 , 08-Фев-19 (1)
> ВОПРОС > Есть способ получить желаемое в одно касание, без перебора? По типу, как > взять 1 элемент: > $name = $json->[0]->{"name"}; > так хотелось бы сразу все "name" > Спасибо.Э... это _должно_ называться map(). Я почти :) уверен. Перла не знаю, "но вы держитесь": $ dat() { echo '[ -- json SKIPPED --]'; } $ dat |jq '[.[].name]' [ "Name1", "Name2", "Name3" ] $ dat |jq 'map(.name)' [ "Name1", "Name2", "Name3" ] $ _
- Красиво собрать массив из глубин JSON, михалыч, 16:29 , 08-Фев-19 (2)
> Э... это _должно_ называться map(). Я почти :) уверен.да, есть это print join("," , map{ $_->{name}} @{$json}); > Перла не знаю, "но вы держитесь": скромничаешь! хых )) и всё-то ты знаешь
- Красиво собрать массив из глубин JSON, GoldenCeylon, 12:23 , 11-Фев-19 (4) +1
> print join("," , map{ $_->{name}} @{$json});Подитожу: @names = map{$_->{name}} @{$json}; или @names = map{$_->{name}} @$json;
- Красиво собрать массив из глубин JSON, Аноним, 05:06 , 10-Фев-19 (3)
> Всем привет! > Ломаю голову.. > Список большой > Есть способ получить желаемое? > И хотелось бы сразу всё! > Спасибо.Ok google! Как сделать мне хорошо и красиво?
- Красиво собрать массив из глубин JSON, Аноним, 13:53 , 14-Фев-19 (5)
Без перебора только так. Регулярку не проверял.my @names = $json_str =~ m/name["\s]*:\s*"([^"]+)/g ;
- Красиво собрать массив из глубин JSON, михалыч, 10:20 , 06-Мрт-19 (7)
> Без перебора только так. Регулярку не проверял. > my @names = $json_str =~ m/name["\s]*:\s*"([^"]+)/g ; не взлетит
- re: не взлетит, Шёл мимо, 09:18 , 10-Авг-19 (10)
> не взлетит #!/usr/bin/perluse strict; use warnings; use JSON; use Data::Dumper; use Benchmark 'cmpthese'; my $json_text = '[ { "id" : "1", "name" : "Name1" }, { "id" : "2", "name" : "Name2" }, { "id" : "3", "name" : "Name3" }]' ; #my $json = JSON->new->decode($json_text); my $json = decode_json($json_text); print Dumper($json); sub mapng { my @names = map { $_->{name} } @{$json}; } sub modif { push my @names, $_->{name} for @{$json}; } sub cycle { for ( @{$json} ) { push my @names, $_->{name}; } } sub ptext { my @names = ($_[0] =~ /^\s*+"name" *+: *+"([^"]*+)"/mg); # print Dumper(@names); } #ptext($json_text); cmpthese( -1, { 'mapng' => sub { mapng($json) }, 'modif' => sub { modif($json) }, 'cycle' => sub { cycle($json) }, 'ptext' => sub { ptext($json_text) }, } ); __END__
ptext 92781/s -- -63% -67% -67% mapng 251601/s 171% -- -11% -12% cycle 281553/s 203% 12% -- -1% modif 284630/s 207% 13% 1% --
Если правильно понял
- Красиво собрать массив из глубин JSON, erera22, 20:44 , 18-Фев-19 (6)
еще до кучи: push @names, $_->{name} for @$json;
- Красиво собрать массив из глубин JSON, михалыч, 10:31 , 06-Мрт-19 (8)
> еще до кучи: > push @names, $_->{name} for @$json; в данном случае for используется как модификатор, но суть дела от этого не меняется и это фактически, да и практически ничем не отличается от классического перебора в цикле for ( @{$json} ) { push @names, $_->{name}; } написано короче, но ещё не известно, что быстрей и лучше для понимания и восприятия (в данном конкретном случае) ))
- Красиво собрать массив из глубин JSON, михалыч, 18:31 , 09-Мрт-19 (9) +1
дело было вечером, делать было нечего, было скучно..вспомнил бородатый анекдот дневник джигита (абрека), захотел вернуться к этому и выяснить, что быстрее работает, потому как map тоже является циклом, только хитрозаточенным, в отличии от for (foreach) и, думаю, не очень его быстрее и чтобы хейтеры (не путать с хипстерами) не начали своё любимое "пруф или трепло", решил - хайпанём, немножечко? )) вот proof, сиречь доказательство
#!/usr/bin/perluse strict; use warnings; use JSON; use Data::Dumper; use Benchmark 'cmpthese'; my $json_text = '[ { "id" : "1", "name" : "Name1" }, { "id" : "2", "name" : "Name2" }, { "id" : "3", "name" : "Name3" }]' ;
#my $json = JSON->new->decode($json_text); my $json = decode_json($json_text); print Dumper($json); sub mapng { my @names = map { $_->{name} } @{$json}; } sub modif { push my @names, $_->{name} for @{$json}; } sub cycle { for ( @{$json} ) { push my @names, $_->{name}; } } cmpthese( -1, { 'mapng' => sub { mapng($json) }, 'modif' => sub { modif($json) }, 'cycle' => sub { cycle($json) }, } );
__END__
что видим? что так и да, mapping быстрее, но не в разы
# ./test.pl $VAR1 = [ { 'name' => 'Name1', 'id' => '1' }, { 'name' => 'Name2', 'id' => '2' }, { 'name' => 'Name3', 'id' => '3' } ]; Rate mapng cycle modif mapng 239064/s -- -8% -9% cycle 260979/s 9% -- -1% modif 262926/s 10% 1% --
выигрыш по скорости небольшой, всего лишь код немного короче (красивее? ;) ), (думаю, что map выгоден для обработки и трансформации массива в другой массив) такие дела блин, опять скучно..
|