सशर्त तत्वों के साथ एक सरणी को कैसे परिभाषित किया जाए?


107

मैं सशर्त सरणी तत्वों को कैसे परिभाषित कर सकता हूं? मैं ऐसा कुछ करना चाहता हूं:

const cond = true;
const myArr = ["foo", cond && "bar"];

यह उम्मीद के मुताबिक काम करता है: ["foo", "bar"]

लेकिन अगर मैं सेट condकरता falseहूं, तो मुझे निम्नलिखित परिणाम मिलेगा:["foo", false]

मैं सशर्त तत्व के साथ एक सरणी को कैसे परिभाषित कर सकता हूं?


जवाबों:


252

आप एक सरणी के अंदर एक सरणी को फैला सकते हैं, ताकि हालत होने पर आइटम सरणी को साफ रखा जा सके false

यहाँ आप इसे कैसे कर सकते हैं :

// Will result in ['foo', 'bar']
const items = [
  'foo',
  ... true ? ['bar'] : [],
  ... false ? ['falsy'] : [],
]

console.log(items)

स्पष्टीकरण :

जैसा कि आप देख सकते हैं कि टर्नेरी ऑपरेटर हमेशा एक सरणी देता है।

यदि स्थिति है true, तो यह वापस आ जाता है ['bar'], अन्यथा एक खाली सरणी []

उसके बाद हम ...परिणामी सरणी (टर्नरी ऑपरेशन से) फैलाते हैं और सरणी के आइटम को मूल सरणी में धकेल दिया जाता है।

यदि कोई ऐरे आइटम नहीं हैं (जब टर्नरी चेक है false), तो कुछ भी धक्का नहीं दिया जाएगा, जो हमारा लक्ष्य है।


अन्य उत्तर में मैंने उसी विचार को समझाया, लेकिन वस्तुओं के लिए। आप इसे यहाँ भी देख सकते हैं


1
मुझे हाल ही में ऐसा करने की आवश्यकता थी और प्रसार का उपयोग करना मेरे लिए सबसे स्पष्ट समाधान की तरह लग रहा था। खुशी है कि अन्य लोग भी इस पैटर्न का उपयोग कर रहे हैं। मैं इसे बहुत अधिक गूढ़ नहीं बनाना चाहता था लेकिन मैं इसके साथ चलने वाला हूं क्योंकि यह काफी लोकप्रिय है।
ब्रेनन चेउंग

बहुत बहुत धन्यवाद ~ !! मैं अभी भी एक विकल्प के रूप में प्रसार पर विचार नहीं किया
carinlynchin

यह बहुत अच्छा है, नहीं सोचा था कि इस तथ्य के बाद सरणी को फ़िल्टर किए बिना ऐसा करने का एक तरीका होगा
JDune

2
धिक्कार है कि क्यों मैं एक्मास्मार्क प्यार करता हूँ
anni

1
उत्कृष्ट समाधान!
21

25

मैं यह करूँगा

[
  true && 'one',
  false && 'two',
  1 === 1 && 'three',
  1 + 1 === 9 && 'four'
].filter(Boolean) // ['one', 'three']

ध्यान दें कि यह खाली स्ट्रिंग जैसे झूठे मूल्यों को भी हटा देगा ।


1
मुझे यह विचार पसंद आया। लेकिन आपका कार्यान्वयन [सत्य और& ''] के लिए गलत होगा। खाली स्ट्रिंग को फ़िल्टर किया जाएगा। मैं इसके बजाय [foo] .filter (isNonBoolean) या [foo] .stripBoolean ()
मार्टिन

@Martin हाँ, शायद यह जवाब में विस्तृत हो सकता है। मैं आगे बढ़कर इसे संपादित करूँगा!
माइकल बर्गक्विस्ट सुआरेज़

मुझे लगता है कि अगर मुझे इस तरह की एक सरणी की आवश्यकता है तो एक समस्या होगी: const arrest = ['one', 'two', false, true]; लेकिन विचार सत्य मूल्य के लिए अच्छा है :)
संजीव देबनाथ


8

यदि आप वास्तव में इसे एक लाइनर के रूप में रखना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

const cond = true;
const myArr = ["foo"].concat(cond ? ["bar"] : []);

चतुर, मेरे लिए सरणी के सशर्त मोर्चे के लिए उपयोगी थाconst myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
22

6

आपके पास उपयोग करने के अलावा बहुत सारे विकल्प नहीं हैं push:

const cond = true;
const myArr = ["foo"];

if (cond) myArr.push("bar");

एक अन्य विचार संभावित रूप से अशक्त जोड़ने और उन्हें फ़िल्टर करने का है:

const cond = true;
const myArr = ["foo", cond ? "bar" : null];

myArr = myArr.filter((item) => item !== null);

3
const cond = false;
const myArr = ["foo", cond ? "bar" : null].filter(Boolean);

console.log(myArr)

में परिणाम होगा "फू"


2

वहाँ कुछ अलग तरीके हैं, लेकिन जिस तरह से आप कर रहे हैं वह वास्तव में जावास्क्रिप्ट के लिए काम नहीं करेगा।

सबसे आसान समाधान सिर्फ एक बयान होगा।

if (myCond) arr.push(element);

वहाँ भी है filter, लेकिन मुझे नहीं लगता है कि आप यहाँ क्या चाहते हैं, क्योंकि आपको लगता है कि "यह एक शर्त जोड़ें, अगर यह एक शर्त सच है" के बजाय कुछ शर्त के खिलाफ सब कुछ जाँचने के लिए जा रहा है। यद्यपि, यदि आप वास्तव में अजीब होना चाहते हैं, तो आप ऐसा कर सकते हैं (अनुशंसा नहीं करेंगे, लेकिन यह अच्छा है कि आप कर सकते हैं)।

var arr = ["a", cond && "bar"];
arr.filter( e => e)

मूल रूप से यह सिर्फ सभी गैर-सच्चे मूल्यों को फ़िल्टर करेगा।


1
यह अच्छा लगता है। आप var arr = ["a", cond && "bar"].filter(e => e);@ अदम लेब्लांक भी कर सकते हैं लेकिन आप सही हैं, यह शायद कचरा है। लेकिन ठंडा कचरा;)
मनु शिलर

यह अच्छा है, लेकिन मैं इसके खिलाफ सिर्फ एक सशर्त मूल्य के लिए सलाह दूंगा। यह एक सामान्य उद्देश्य के लिए बेहतर है "सभी झूठे मूल्यों से छुटकारा पाएं" प्रकार की चीज। चूंकि आप सिर्फ एक मूल्य के लिए संपूर्ण सरणी से गुजरने वाले हैं। लेकिन अगर आपके पास सशर्त मूल्यों की अनिर्धारित मात्रा है, तो यह शायद एक अच्छा समाधान है।
एडम लेब्लांक

.filter (e => e) खाली स्ट्रिंग को फ़िल्टर करेगा।
मार्टिन

0

वैकल्पिक दृष्टिकोण: पोस्ट फ़िल्टरिंग के बजाय पूर्व फ़िल्टर आबाद करें:

const populate = function(...values) {
    return values.filter(function(el) {
        return el !== false
    });
};

console.log(populate("foo", true && "bar", false && "baz"))

रिटर्न

(2) ["foo", "bar"]

मुझे पता है कि शॉर्टहैंड नोटेशन को हल नहीं किया जाता है (क्योंकि यह कोई फर्क नहीं पड़ता कि आप क्या कोशिश करते हैं) काम नहीं करेगा, लेकिन यह उसी के करीब आता है।


0

यदि आप es6 का उपयोग कर रहे हैं, तो मैं सुझाव दूंगा

let array = [ "bike", "car", name === "van" ? "van" : null, "bus", "truck", ].filter(Boolean);

इस सरणी में केवल मूल्य "वैन" होगा यदि नाम "वैन" के बराबर है, अन्यथा इसे छोड़ दिया जाएगा।


-1

यदि तुम प्रयोग करते हो Array.push

आप अनुसरण कर सकते हैं

var a = ["1"]
a.push(... !true ? ["2"] : [])

परिणाम है ["1"]

या

var a = ["1"]
a.push(... true ? ["2"] : [])

परिणाम है ["1","2"]


यदि आप a checkऔर a का उपयोग करने जा रहे हैंpush आपका समाधान निश्चित रूप से उच्चतम स्पष्टता वाला नहीं है। मैं if (check) foo.push( item );झूठे मुकदमे में फ़र्ज़ी मुकदमे फैलाने की बजाय उनके साथ रहना चाहता हूँ ।
मार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.