mirror of
https://github.com/mikefarah/yq.git
synced 2025-01-23 14:16:10 +00:00
Added reduce examples and doc
This commit is contained in:
parent
b2317a14ef
commit
99b08fd612
@ -0,0 +1,43 @@
|
|||||||
|
Reduce is a powerful way to process a collection of data into a new form.
|
||||||
|
|
||||||
|
## yq vs jq syntax
|
||||||
|
Reduce syntax in `yq` is a little different from `jq` - as `yq` (currently) isn't as sophisticated as `jq` and its only supports infix notation (e.g. a + b, the operator is in the middle of the two parameters) - where as `jq` uses a mix of infix notation with _prefix_ notation (e.g. `reduce a b` is like writing `+ a b`).
|
||||||
|
|
||||||
|
To that end, the reduce operator is called `ireduce` for backwards compatability if a prefix version of `reduce` is ever added.
|
||||||
|
|
||||||
|
|
||||||
|
## Sum numbers
|
||||||
|
Given a sample.yml file of:
|
||||||
|
```yaml
|
||||||
|
- 10
|
||||||
|
- 2
|
||||||
|
- 5
|
||||||
|
- 3
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yq eval '.[] as $item ireduce (0; . + $item)' sample.yml
|
||||||
|
```
|
||||||
|
will output
|
||||||
|
```yaml
|
||||||
|
20
|
||||||
|
```
|
||||||
|
|
||||||
|
## Convert an array to an object
|
||||||
|
Given a sample.yml file of:
|
||||||
|
```yaml
|
||||||
|
- name: Cathy
|
||||||
|
has: apples
|
||||||
|
- name: Bob
|
||||||
|
has: bananas
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yq eval '.[] as $item ireduce ({}; .[$item | .name] = ($item | .has) )' sample.yml
|
||||||
|
```
|
||||||
|
will output
|
||||||
|
```yaml
|
||||||
|
Cathy: apples
|
||||||
|
Bob: bananas
|
||||||
|
```
|
||||||
|
|
7
pkg/yqlib/doc/headers/Reduce.md
Normal file
7
pkg/yqlib/doc/headers/Reduce.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
Reduce is a powerful way to process a collection of data into a new form.
|
||||||
|
|
||||||
|
## yq vs jq syntax
|
||||||
|
Reduce syntax in `yq` is a little different from `jq` - as `yq` (currently) isn't as sophisticated as `jq` and its only supports infix notation (e.g. a + b, the operator is in the middle of the two parameters) - where as `jq` uses a mix of infix notation with _prefix_ notation (e.g. `reduce a b` is like writing `+ a b`).
|
||||||
|
|
||||||
|
To that end, the reduce operator is called `ireduce` for backwards compatability if a prefix version of `reduce` is ever added.
|
||||||
|
|
@ -6,17 +6,26 @@ import (
|
|||||||
|
|
||||||
var reduceOperatorScenarios = []expressionScenario{
|
var reduceOperatorScenarios = []expressionScenario{
|
||||||
{
|
{
|
||||||
document: `[10,2, 5, 3]`,
|
description: "Sum numbers",
|
||||||
expression: `.[] as $item ireduce (0; . + $item)`,
|
document: `[10,2, 5, 3]`,
|
||||||
|
expression: `.[] as $item ireduce (0; . + $item)`,
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"D0, P[], (!!int)::20\n",
|
"D0, P[], (!!int)::20\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
description: "Convert an array to an object",
|
||||||
|
document: `[{name: Cathy, has: apples},{name: Bob, has: bananas}]`,
|
||||||
|
expression: `.[] as $item ireduce ({}; .[$item | .name] = ($item | .has) )`,
|
||||||
|
expected: []string{
|
||||||
|
"D0, P[], (!!map)::Cathy: apples\nBob: bananas\n",
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReduceOperatorScenarios(t *testing.T) {
|
func TestReduceOperatorScenarios(t *testing.T) {
|
||||||
for _, tt := range reduceOperatorScenarios {
|
for _, tt := range reduceOperatorScenarios {
|
||||||
testScenario(t, &tt)
|
testScenario(t, &tt)
|
||||||
}
|
}
|
||||||
// documentScenarios(t, "Reduce", reduceOperatorScenarios)
|
documentScenarios(t, "Reduce", reduceOperatorScenarios)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user