শর্তসাপেক্ষ উপাদানগুলির সাথে অ্যারের সংজ্ঞা কীভাবে দেওয়া যায়?


99

আমি কীভাবে শর্তযুক্ত অ্যারে উপাদানগুলি সংজ্ঞা দিতে পারি? আমি এরকম কিছু করতে চাই:

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

এটি প্রত্যাশার মতো কাজ করে: ["foo", "bar"]

তবে যদি আমি সেট করে condরাখি তবে আমি falseনিম্নলিখিত ফলাফলটি পেয়েছি:["foo", false]

আমি কীভাবে শর্তযুক্ত উপাদান সহ একটি অ্যারে সংজ্ঞা দিতে পারি?


উত্তর:


231

যখন অবস্থা থাকে তখন আইটেমি অ্যারে পরিষ্কার রাখার জন্য আপনি কোনও অ্যারের ভিতরে একটি অ্যারে ছড়িয়ে দিতে পারেন false

আপনি এটি কীভাবে করতে পারেন তা এখানে :

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

console.log(items)

ব্যাখ্যা :

যেমন আপনি দেখতে পাচ্ছেন টেরিনারি অপারেটর সর্বদা একটি অ্যারে প্রদান করে।

যদি শর্তটি থাকে trueতবে তা ফিরে আসে ['bar'], অন্যথায় একটি ফাঁকা অ্যারে []

এর পরে আমরা ...ফলাফলের অ্যারেটি ছড়িয়ে দিয়েছি (টেরিনারি অপারেশন থেকে) এবং অ্যারের আইটেমগুলি প্যারেন্ট অ্যারেতে ঠেলাঠেলি করা হয়।

যদি কোনও অ্যারে আইটেম না থাকে (যখন টের্নারি চেক হয় false), তবে কিছুই ধাক্কা দেওয়া হবে না, যা আমাদের লক্ষ্য।


অন্য উত্তরে আমি একই ধারণাটি ব্যাখ্যা করেছি তবে বস্তুর জন্য। আপনি এটি এখানে পরীক্ষা করতে পারেন ।


4
আমার সম্প্রতি এটি করার দরকার ছিল এবং স্প্রেড ব্যবহার করা আমার কাছে সবচেয়ে সুস্পষ্ট সমাধান বলে মনে হয়েছিল। খুশি অন্যরাও এই প্যাটার্নটি ব্যবহার করছেন। আমি এটিকে খুব কৌতূহলপূর্ণ করতে চাইনি তবে এটি যথেষ্ট জনপ্রিয় বলে মনে হচ্ছে আমি এটি নিয়ে চালাচ্ছি।
ব্রেনান চেউং

অনেক অনেক ধন্যবাদ ~ !! আমি এমনকি
স্প্রেডটিকে

এটি খুব দুর্দান্ত, সত্যের পরে অ্যারে ফিল্টার না করে এটি করার কোনও উপায় থাকবে বলে
ভাবেননি

4
যে কেন আমি ECMAScript ভালবাসেন গোল্লায় যাক
বছর

4
দুর্দান্ত সমাধান!
21

22

আমি এটা করতাম

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

মনে রাখবেন এটি খালি স্ট্রিংয়ের মতো মিথ্যা মানগুলিও সরিয়ে ফেলবে


4
আমি ধারণা পছন্দ। তবে [বাস্তব && ''] এর জন্য আপনার বাস্তবায়ন ভুল হবে। খালি স্ট্রিং ফিল্টার আউট হবে। আমি বরং [foo]। ফিল্টার (isNonBoolean) বা [foo]। স্ট্রিপবুলিয়ান ()
মার্টিন

@ মার্টিন হ্যাঁ, সম্ভবত এটি উত্তরে ব্যাখ্যা করা যেতে পারে। আমি এগিয়ে গিয়ে এডিট করব!
মাইকেল বার্গকুইস্ট সুয়ারেজ

আমি মনে করি যদি এর মতো অ্যারে প্রয়োজন হয় তবে সমস্যা হবে: কনস্ট আরার = ['এক', 'দুই', মিথ্যা, সত্য]; তবে ধারণা সত্যের মূল্য জন্য ভাল :)
দেবনাথ


8

আপনি যদি সত্যিই এটি ওয়ান লাইনার হিসাবে রাখতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

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

চতুর, অ্যারে এর শর্তসাপেক্ষে সামনের জন্য আমার জন্য দরকারী ছিলconst myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
ডিভনজ

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);


2

কয়েকটি ভিন্ন উপায় আছে, তবে আপনি যেভাবে এটি করছেন সেটি জাভাস্ক্রিপ্টের জন্য সত্যিই কাজ করবে না।

সবচেয়ে সহজ সমাধানটি হবে যদি কেবলমাত্র একটি বিবৃতি থাকে।

if (myCond) arr.push(element);

এছাড়াও আছে filter, তবে আমি মনে করি না যে আপনি এখানে কিছু চান, যেহেতু আপনি কিছু শর্তের বিপরীতে সমস্ত কিছু পরীক্ষা না করে "এই একটি জিনিস যুক্ত করুন, যদি এই এক শর্তটি সত্য হয়" বলে মনে হয়। যদিও, আপনি যদি সত্যিই অদ্ভুত হতে চান তবে আপনি এটি করতে পারেন (এটি প্রস্তাব করবেন না, তবে এটি দুর্দান্ত যে আপনি এটি করতে পারেন)।

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

মূলত এটি সমস্ত অ সত্যের মানগুলি ফিল্টার করে দেবে।


4
এটা দুর্দান্ত মনে হচ্ছে। আপনি 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

আপনি যদি এস 6 ব্যবহার করছেন তবে আমি পরামর্শ দেব

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"]


আপনি যদি কোনও checkএবং একটি ব্যবহার করতে চলেছেন pushতবে সর্বাধিক স্পষ্টতার সাথে আপনার সমাধানটি অবশ্যই তা নয়। if (check) foo.push( item );মিথ্যা মামলায় খালি অ্যারে ছড়িয়ে দেওয়ার পরিবর্তে আমি আটকে থাকতাম।
মার্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.