LINUX.ORG.RU

Рекурсивных обход Record в Nushell

 , nushell, , ,


0

1

Исходное сообщение о работе с JSON.

@ZogG, @Dr64h вы не в курсе как обходить рекурсивно обходить Record, чтоб получать путь и значение каждого элемента?

То что, я пока нашел не подоходит. Просто превратить весь Record в огромную однострочку табицу где данные хранятся под именами столбцов. Могу получить имена столбцов. А вот пару имя/значение пока не знаю как.

~/tmp/nu> open react_p.json | flatten | columns | where ($it | str contains "lint")
╭────┬────────────────────────────────────────────────╮
│  0 │ @typescript-eslint/eslint-plugin               │
│  1 │ @typescript-eslint/parser                      │
│  2 │ eslint                                         │
│  3 │ eslint-config-prettier                         │
│  4 │ eslint-plugin-babel                            │
│  5 │ eslint-plugin-es                               │
│  6 │ eslint-plugin-eslint-plugin                    │
│  7 │ eslint-plugin-ft-flow                          │
│  8 │ eslint-plugin-jest                             │
│  9 │ eslint-plugin-no-for-of-loops                  │
│ 10 │ eslint-plugin-no-function-declare-after-return │
│ 11 │ eslint-plugin-react                            │
│ 12 │ eslint-plugin-react-internal                   │
│ 13 │ hermes-eslint                                  │
│ 14 │ lint                                           │
│ 15 │ lint-build                                     │
╰────┴────────────────────────────────────────────────╯

Через zip я добился создание таблицы. Но в ней нет пути.

~/tmp/nu> let names = open react_p.json | flatten | columns
~/tmp/nu> let vals = open react_p.json | flatten | values
~/tmp/nu> let pairs = $names | zip $vals

~/tmp/nu> $pairs | where ($it.0 | str contains lint) |
reduce -f [[key value]; [0,0]] {|it, acc| $acc | append [[key value]; [$it.0, $it.1.0]]} |
skip 1
╭────┬────────────────────────────────────────────────┬─────────────────────────────────────────╮
│  # │                      key                       │                  value                  │
├────┼────────────────────────────────────────────────┼─────────────────────────────────────────┤
│  0 │ @typescript-eslint/eslint-plugin               │ ^6.21.0                                 │
│  1 │ @typescript-eslint/parser                      │ ^6.21.0                                 │
│  2 │ eslint                                         │ ^7.7.5                                  │
│  3 │ eslint-config-prettier                         │ ^6.9.0                                  │
│  4 │ eslint-plugin-babel                            │ ^5.3.0                                  │
│  5 │ eslint-plugin-es                               │ ^4.1.0                                  │
│  6 │ eslint-plugin-eslint-plugin                    │ ^3.5.3                                  │
│  7 │ eslint-plugin-ft-flow                          │ ^2.0.3                                  │
│  8 │ eslint-plugin-jest                             │ 28.4.0                                  │
│  9 │ eslint-plugin-no-for-of-loops                  │ ^1.0.0                                  │
│ 10 │ eslint-plugin-no-function-declare-after-return │ ^1.0.0                                  │
│ 11 │ eslint-plugin-react                            │ ^6.7.1                                  │
│ 12 │ eslint-plugin-react-internal                   │ link:./scripts/eslint-rules             │
│ 13 │ hermes-eslint                                  │ ^0.22.0                                 │
│ 14 │ lint                                           │ node ./scripts/tasks/eslint.js          │
│ 15 │ lint-build                                     │ node ./scripts/rollup/validate/index.js │
╰────┴────────────────────────────────────────────────┴─────────────────────────────────────────╯


Последнее исправление: dataman (всего исправлений: 1)

Я бы сначала попробовал jq для подобной задачи.

FishHook
()

не используй нюшел этот. он нестандартный и его популярность меньше статистической погрешности. даже поверщель предпочтительнее. у jq дурацкий синтаксис, но диксик может генерить снипеты для него

rtxtxtrx ★★
()
Ответ на: комментарий от FishHook

Да это package.json из React.

https://raw.githubusercontent.com/facebook/react/refs/heads/main/package.json 
lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 2)
Ответ на: комментарий от rtxtxtrx

не используй нюшел этот. он нестандартный и его популярность меньше статистической погрешности.

Мне нравится, похож на Ruby.

lbvf50txt
() автор топика

В pwsh я бы сделал так:

$  & {                                                                                                  
        $json = (iwr https://raw.githubusercontent.com/facebook/react/refs/heads/main/package.json).content
        ($json | ConvertFrom-Json).devDependencies | select "*lint*"
    }
                                                                                                                       
@typescript-eslint/eslint-plugin               : ^6.21.0
@typescript-eslint/parser                      : ^6.21.0
eslint                                         : ^7.7.0
eslint-config-prettier                         : ^6.9.0
eslint-plugin-babel                            : ^5.3.0
eslint-plugin-es                               : ^4.1.0
eslint-plugin-eslint-plugin                    : ^3.5.3
eslint-plugin-ft-flow                          : ^2.0.3
eslint-plugin-jest                             : 28.4.0
eslint-plugin-no-for-of-loops                  : ^1.0.0
eslint-plugin-no-function-declare-after-return : ^1.0.0
eslint-plugin-react                            : ^6.7.1
eslint-plugin-react-internal                   : link:./scripts/eslint-rules
hermes-eslint                                  : ^0.22.0

dmitry237 ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.