Jq के साथ, मैं एक सरणी में प्रविष्टियों को एक अलग सरणी में अनुक्रमणित करने के लिए उपयोग करने का प्रयास कर रहा हूं। एक साधारण JSON इनपुट इस तरह दिखेगा:

{
    "myArray": [ "AA", "BB", "CC", "DD", "EE" ],
    "myFlags": [ 4, 3, 2, 1, 0 ]
}

Jq का निफ्टी 'as' ऑपरेटर तब myArray सरणी को दायरे में लाने में सक्षम है और अनुक्रमण ठीक काम करता है:

.myArray as $Array | .myFlags | .[] | $Array[.]   ====> yields "EE","DD","CC","BB","AA"

अब तक jq-manual. हालांकि, अगर मैं $Array सरणी पहुंच को किसी फ़ंक्शन में नीचे ले जाने का प्रयास करता हूं, तो as-variable दायरा गायब हो जाता है:

def myFun: $Array[.]; .myArray as $Array | .myFlags | .[] | myFun

jq: error: $Array is not defined at <top-level>, line 1:
def myFun: $Array[.]; .myArray as $Array | .myFlags | .[] | myFun   

इसके आस-पास जाने के लिए, मैं वर्तमान में एक अस्थायी JSON ऑब्जेक्ट पास करता हूं जिसमें इंडेक्स और सरणी दोनों होते हैं:

def myFun: .a[.b]; .myArray as $Array | .myFlags | .[] | { a: $Array, b: . } | myFun

हालांकि यह काम करता है, मुझे कहना होगा कि मैं इसके साथ बहुत सहज नहीं हूं।

वास्तव में, यह मुझे ऐसा नहीं लगता जैसे कि यह उचित jq भाषा व्यवहार है। मुझे ऐसा लगता है कि 'as'-स्कोप को इनवॉइस किए गए डीफ़-फ़ंक्शंस में बने रहना चाहिए। :-(

क्या डीफ़-फ़ंक्शंस में एएस-स्कोप को विस्तारित करने का कोई बेहतर तरीका है? क्या मुझे कुछ जेक्यू सूक्ष्मता याद आ रही है?

1
nickpelling 14 जिंदा 2020, 20:15

1 उत्तर

सबसे बढ़िया उत्तर

किसी फ़ंक्शन के अंदर एक पैरामीटर के रूप में पास किए बिना "as" वैरिएबल को दृश्यमान बनाना वास्तव में संभव है (नीचे "लेक्सिकल स्कोपिंग" देखें), लेकिन यह आमतौर पर अनावश्यक है, और वास्तव में "as" वेरिएबल्स का उपयोग करना अक्सर अनावश्यक भी होता है। .

"के रूप में" चर से बचना

आप अपनी मूल क्वेरी को सरल बना सकते हैं:

.myArray[.myFlags[]]

फ़ंक्शन तर्कों का उपयोग करना

आप एक या अधिक तर्कों के साथ jq फ़ंक्शन लिख सकते हैं। फ़िल्टर को पैरामीटराइज़ करने का यह उपयुक्त तरीका है।

सिंटैक्स काफी पारंपरिक है सिवाय इसके कि एक से अधिक तर्क वाले कार्यों के लिए, अर्धविराम (";") का उपयोग तर्क विभाजक के रूप में किया जाता है, दोनों फ़ंक्शन परिभाषाओं और आमंत्रणों में।

यह भी ध्यान दें कि jq फ़ंक्शन तर्क स्वयं फ़िल्टर हो सकते हैं, उदा। आप लिख सकते हैं:

def myFun(array; $ix): array | .[$ix];

myFun(.myArray; .myFlags[])

लेक्सिकल स्कोपिंग

यहां एक उदाहरण दिया गया है जिसमें दिखाया गया है कि किसी फ़ंक्शन के अंदर 'as' वेरिएबल को कैसे दृश्यमान बनाया जा सकता है:

[1,2] as $array | def myFun: $array[1]; myFun
1
peak 14 जिंदा 2020, 21:31