mirror of
				https://github.com/taigrr/yq
				synced 2025-01-18 04:53:17 -08: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{ | ||||||
| 	{ | 	{ | ||||||
|  | 		description: "Sum numbers", | ||||||
| 		document:    `[10,2, 5, 3]`, | 		document:    `[10,2, 5, 3]`, | ||||||
| 		expression:  `.[] as $item ireduce (0; . + $item)`, | 		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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user