নিজেকে পুনরাবৃত্তি না করে কীভাবে কোনও টার্নারি অপারেটর (ওরফে যদি) এক্সপ্রেশন লিখতে হয়


104

উদাহরণস্বরূপ, এর মতো কিছু:

var value = someArray.indexOf(3) !== -1 ? someArray.indexOf(3) : 0

এটি লেখার আরও ভাল উপায় আছে কি? আবার, আমি উপরের সঠিক প্রশ্নের উত্তর চাইছি না, কেবল যখন আপনি বার্ষিক অপারেটরগুলি বার্ষিক অপারেটর এক্সপ্রেশন হতে পারে তার একটি উদাহরণ ...


2
সুতরাং একটি ifএবং একটি নয়if/else
zer00ne

53
just an example of when you might have repeated things in the ternaryগণনা করা এক্সপ্রেশন পুনরাবৃত্তি করবেন না। ভেরিয়েবলের জন্য এটিই।
ভোলআরন

4
আমরা কীভাবে নির্ধারণ করব যে এর 3সূচীতে 0নেই someArray?
অতিথি 271314

3
এখানে আপনার লক্ষ্য কি? আপনি কি লাইনের দৈর্ঘ্য হ্রাস করার চেষ্টা করছেন, বা বিশেষত কোনও ত্রৈমাসিকের কোনও ভেরিয়েবলের পুনরাবৃত্তি এড়াতে চেষ্টা করছেন? পূর্ববর্তীটি সম্ভব, পরবর্তীগুলি (কমপক্ষে, টের্নারিগুলি ব্যবহার না করে) নয়।
asgallant

5
Math.max(someArray.indexOf(3), 0)পরিবর্তে ব্যবহার করবেন না কেন ?
301_ মোভেড_ স্থায়ীভাবে

উত্তর:


176

ব্যক্তিগতভাবে আমি এটি করার সর্বোত্তম উপায়টি এখনও ভাল পুরানো ifবিবৃতি:

var value = someArray.indexOf(3);
if (value === -1) {
  value = 0;
}

32
স্পষ্টতই, এই উত্তরটি মধ্যবর্তী ফলাফল সংরক্ষণের জন্য ভেরিয়েবলের ব্যবহারের সমর্থন করে if, কোনও ত্রিবারির জায়গায় কোনও বিবৃতি ব্যবহারের জন্য নয় । অভিব্যক্তির অংশ হিসাবে পছন্দটি সম্পাদন করতে টেরানারি স্টেটমেন্টগুলি প্রায়শই কার্যকর।
ট্রিপটিচ

4
@ ট্রিপটিচ: এটি আবার দেখুন। এটি কোনও মধ্যবর্তী ভেরিয়েবলটি মোটেও ব্যবহার করে না। পরিবর্তে এটি ফলাফলটি চূড়ান্ত পরিবর্তনশীলকে সরাসরি বরাদ্দ করে এবং তারপরে শর্ত পূরণ হলে এটি ওভাররাইট করে।
slebetman

14
ত্রুটিপূর্ণ. valueপ্রথম লাইনের পরে সঞ্চিত মানটি মধ্যবর্তী হয়। এটিতে সঠিক মান থাকে না যা পরবর্তী লাইনে স্থির হয় এবং এইভাবে মধ্যবর্তী হয়। ifবিবৃতিটি শেষ হওয়ার পরেই valueএটিতে সঠিক মান রয়েছে। ওপিতে ত্রৈমাসিক একটি আরও ভাল সমাধান যা এটি কখনও কখনও মধ্যবর্তী অবস্থায় প্রবেশ করে না।
জ্যাক এইডলি

44
@ জ্যাকএইডলি: "ওপি-র দশকটি একটি আরও ভাল সমাধান যা এটি কখনও কখনও মধ্যবর্তী অবস্থায় প্রবেশ করে না।" - আমি একমত হতে হবে। এটি ওপি-র কোডের চেয়ে অনেক বেশি পঠনযোগ্য এবং পুরোপুরি মুশকিল। এটি ওপি-র যুক্তিতে একটি বাগও আমার কাছে আরও স্পষ্ট করে তোলে (যথা, সূচকফ) () যদি শূন্য ফিরে আসে তবে কী ঘটে? আপনি একটি "আসল" শূন্যকে "পাওয়া যায়নি" শূন্য থেকে কীভাবে আলাদা করবেন?)
কেভিন

2
এটি আমি যা করতে চাই তার কাছাকাছি, valueএখানে প্রযুক্তিগতভাবে পরিবর্তিত, যা আমি এড়াতে চেষ্টা করি।
ডেভ কাজিনো

102

কোডটি পঠনযোগ্য হওয়া উচিত, সুতরাং সংক্ষিপ্ত হওয়ার অর্থটি যে পরিমাণই ব্যয় করা উচিত নয় - এর জন্য আপনার https://codegolf.stackexchange.com/ এ পুনরায় পোস্ট করা উচিত - সুতরাং পরিবর্তে আমি indexপঠন বোধগম্যতা সর্বাধিককরণের জন্য নামের একটি দ্বিতীয় স্থানীয় ভেরিয়েবল ব্যবহার করার সুপারিশ করব ( ন্যূনতম রানটাইম ব্যয় সহ, আমি দ্রষ্টব্য):

var index = someArray.indexOf( 3 );
var value = index == -1 ? 0 : index;

তবে আপনি যদি সত্যিই এই ভাবটি কমিয়ে দিতে চান, কারণ আপনি যদি আপনার সহকর্মী বা প্রকল্পের সহযোগীদের প্রতি নিষ্ঠুর অনুরাগী হন, তবে আপনি ব্যবহার করতে পারেন এমন 4 টি পদ্ধতি এখানে:

1: একটি varবিবৃতিতে অস্থায়ী পরিবর্তনশীল

কমা দিয়ে আলাদা হয়ে যাওয়ার সময় আপনি varদ্বিতীয় অস্থায়ী পরিবর্তনশীল সংজ্ঞা দিতে (এবং নির্ধারিত) বক্তব্যটির ক্ষমতা ব্যবহার করতে পারেন index:

var index = someArray.indexOf(3), value = index !== -1 ? index: 0;

2: স্ব-নির্বাহী বেনাম ফাংশন

আরেকটি বিকল্প হ'ল একটি স্ব-কার্যকরকারী বেনামে ফাংশন:

// Traditional syntax:
var value = function( x ) { return x !== -1 ? x : 0 }( someArray.indexOf(3) );

// ES6 syntax:
var value = ( x => x !== -1 ? x : 0 )( someArray.indexOf(3) );

3: কমা অপারেটর

এছাড়াও জাভা স্ক্রিপ্ট সমর্থন করে এমন কুখ্যাত "কমা অপারেটর", যা সি এবং সি ++ তে উপস্থিত রয়েছে।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

আপনি যখন কোনও একক অভিব্যক্তি প্রয়োজন এমন একাধিক অভিব্যক্তি অন্তর্ভুক্ত করতে চান তখন আপনি কমা অপারেটরটি ব্যবহার করতে পারেন।

আপনি এটিকে পুনরায় সাইন ইন করে এই ক্ষেত্রে, পার্শ্ব-প্রতিক্রিয়াগুলি প্রবর্তন করতে এটি ব্যবহার করতে পারেন value:

var value = ( value = someArray.indexOf(3), value !== -1 ? value : 0 );

এটি কাজ করে কারণ var valueপ্রথমে ব্যাখ্যা করা হয়েছে (এটি একটি বিবৃতি হিসাবে), এবং তারপরে বাম-সর্বাধিক, অভ্যন্তরীণ সর্বাধিক valueঅ্যাসাইনমেন্ট এবং তারপরে কমা অপারেটরের ডান হাত এবং তারপরে টেরিনারি অপারেটর - সমস্ত আইনী জাভাস্ক্রিপ্ট।

4: একটি subexpression পুনরায় নিয়োগ

ভাষ্যকার @ ইলিউসিভ ব্রায়ান উল্লেখ করেছেন যে কমা-অপারেটরের ব্যবহার (পূর্ববর্তী উদাহরণে) অপ্রয়োজনীয় যদি অ্যাসাইনমেন্টটি প্রথম valueবন্ধনীযুক্ত সুবে এক্সপ্রেশন হিসাবে ব্যবহৃত হয়:

var value = ( ( value = someArray.indexOf(3) ) !== -1 ? value : 0 );

নোট করুন যে লজিক্যাল এক্সপ্রেশনগুলিতে নেতিবাচক ব্যবহারগুলি মানুষের পক্ষে অনুসরণ করা আরও শক্ত হতে পারে - সুতরাং উপরের সমস্ত উদাহরণে পরিবর্তনের idx !== -1 ? x : yমাধ্যমে পড়ার জন্য সহজ করা যেতে পারে idx == -1 ? y : x:

var value = ( ( value = someArray.indexOf(3) ) == -1 ? 0 : value );

97
এগুলি সমস্তই "চালাক" কোডিংয়ের ধরণ যা "হু, আমি অনুমান করি যে এটি কাজ করে" " তারা স্পষ্টতার সাথে সহায়তা করে না এবং যেহেতু কোডটি বেশি গুরুত্বপূর্ণ তাই লেখা হয় যা এটি গুরুত্বপূর্ণ।
গ্যাভিন এস ইয়ানসি

18
@ জি.রোকট পদ্ধতির ১টি 100% পঠনযোগ্য এবং পরিষ্কার indefOf )
এডিসি 65

5
সম্মত, # 1 খুব পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য, অন্য দুটি এত বেশি নয়।
মাফসনসন

6
# 3 এর জন্য, আমি বিশ্বাস করি আপনি var value = ((value = someArray.indexOf(3)) === -1 ? 0 : value);কমা ব্যবহার না করে সহজ করতে পারবেন ।
IllusiveBrian

2
দ্বিতীয় উদাহরণে স্ব-সম্পাদনকারী বেনামি ফাংশনটিতে আপনি তীর ফাংশন থেকে প্রথম বন্ধনী বাদ দিতে পারেন। var value = ( x => x !== -1 ? x : 0 ) ( arr.indexOf(3) );কারণ শুধুমাত্র একটি প্যারামিটার।
অ্যালেক্স চর

54

সংখ্যার জন্য

আপনি Math.max()ফাংশনটি ব্যবহার করতে পারেন ।

var value = Math.max( someArray.indexOf('y'), 0 );

এটি 0ফলাফলের সীমাটি প্রথম ফলাফল অবধি তার চেয়ে বেশি 0রাখবে যদি সে ক্ষেত্রে হয় না। এবং ফলাফলটি যদি হয় indexOfতবে -1এটি 0 এর চেয়ে বড় হিসাবে ফিরে আসবে -1

বুলিয়ান এবং বুলিয়ান- y মানের জন্য

জেএসের পক্ষে আফিকের কোনও সাধারণ নিয়ম নেই বিশেষভাবে কারণ মিথ্যা মানগুলি কীভাবে মূল্যায়ন করা হয়।

তবে যদি কোনও কিছু আপনাকে বেশিরভাগ সময় সাহায্য করতে পারে তবে তা হ'ল অপারেটর (|| ):

// Instead of
var variable = this_one === true ? this_one : or_this_one;
// you can use
var variable = this_one || or_this_one;

আপনাকে এটি সম্পর্কে খুব সাবধানতা অবলম্বন করতে হবে, কারণ আপনার প্রথম উদাহরণে, indexOfফিরে আসতে পারে 0এবং আপনি যদি মূল্যায়ন করেন তবে 0 || -1এটি ফিরে আসবে -1কারণ 0একটি মিথ্যা মান।


2
ধন্যবাদ। আমার অনুমান আমার উদাহরণটি খারাপ আমি ঠিক একটি সাধারণ উদাহরণ দিচ্ছি ঠিক সঠিক প্রশ্নের সমাধান চাইছেন না ha উদাহরণস্বরূপ আমি কয়েকটি স্ক্যানারিওর মুখোমুখি হয়েছি যেখানে আমি একটি
টেনারি

1
প্রথম উদাহরণে, আমরা কীভাবে এটি নির্ধারণ করব 3বা এর "y"সূচীতে 0নেই someArray?
অতিথি 271314

উপর Math.maxউদাহরণ? indexOfউপাদানের সূচকটি ফেরত দেয় এবং যদি উপাদানটি পাওয়া যায় না -১ রিটার্ন দেয় তবে আপনার -1 থেকে স্ট্রিংয়ের দৈর্ঘ্যের একটি নম্বর পাওয়ার সম্ভাবনা রয়েছে তবে Math.maxআপনার সুযোগটি সরিয়ে দিতে কেবল 0 থেকে দৈর্ঘ্যের সীমানা নির্ধারণ করুন with একটি -১,
ক্রিসোফোরো গ্যাসপাড়

@ মিতোঘ ওপিতে কোডটিতে যুক্তি একটি সমস্যা তৈরি করে, সাধারণ উদাহরণ হলেও এটি; যেখানে 0 উভয় 0অ্যারেতে মিলিত উপাদানগুলির সূচক নির্দেশ করতে পারে বা 0সেট করা যেতে পারে Math.max(); বা ওপিতে শর্তসাপেক্ষ অপারেটরে। বিবেচনা করুন var value = Math.max( ["y"].indexOf("y"), 0 )। কোনটি 0ফিরিয়ে দেওয়া হচ্ছে তা আপনি কীভাবে নির্ধারণ করবেন ? কল 0করতে Math.max()পেরেছে, বা অ্যারের মধ্যে 0সূচক প্রতিফলিত "y"?
অতিথি 271314

@ অতিথি 271314 ভাল চিন্তাভাবনা, তবে আমি মনে করি এটি প্রসঙ্গের উপর নির্ভর করে এটি কোনও সমস্যা কিনা। সম্ভবত 0 কোথা থেকে এসেছে তা বিবেচনাধীন নয় এবং কেবল গুরুত্বপূর্ণ জিনিসটি এটি -1 নয়। একটি উদাহরণ: সম্ভবত আপনাকে অ্যারে থেকে কোনও আইটেম বাছাই করতে হবে। আপনি একটি নির্দিষ্ট আইটেম চান (ওপিতে, সংখ্যা 3), তবে এটি অ্যারেতে না থাকলে আপনার এখনও একটি আইটেম প্রয়োজন এবং প্রথম আইটেমটি যাই হোক না কেন ডিফল্ট করে আপনি ঠিক আছেন, ধরে নিয়ে আপনি অ্যারে আইসন জানেন না ' টি খালি।
কেভ

27

আসলেই নয়, কেবল অন্য ভেরিয়েবল ব্যবহার করুন।

আপনার উদাহরণটি এরকম কিছুকে সাধারণীকরণ করে।

var x = predicate(f()) ? f() : default;

আপনি একটি গণিত মান পরীক্ষা করছেন, তারপরে কোনও ভেরিয়েবলকে যদি মানটি নির্দিষ্ট করে দেয় তবে এটি কোনও ভেরিয়েটকে পাস করে। গণনা করা মানটি পুনরায় গণনা এড়ানোর উপায়টি সুস্পষ্ট: ফলাফল সংরক্ষণের জন্য একটি ভেরিয়েবল ব্যবহার করুন।

var computed = f();
var x = predicate(computed) ? computed : default;

আপনি যা বলতে চাইছেন তা আমি পেয়েছি - দেখে মনে হচ্ছে এটির কিছু উপায় হওয়া উচিত যা দেখতে একটু পরিষ্কার দেখাচ্ছে। তবে আমি মনে করি এটি করার পক্ষে এটি সর্বোত্তম উপায় id আপনি যদি কোনও কারণে আপনার কোডটিতে এই প্যাটার্নটি প্রচুর পুনরাবৃত্তি করে থাকেন তবে আপনি সম্ভবত কিছু সহায়ক ফাংশন লিখতে পারেন:

var setif = (value, predicate, default) => predicate(value) ? value : default;
var x = setif(someArray.indexOf(3), x => x !== -1, 0)

17

সম্পাদনা: এটি এখন, জাভাস্ক্রিপ্টে নুলারি-কোয়েলসিংয়ের প্রস্তাব !


ব্যবহার ||

const result = a ? a : 'fallback value';

সমতুল্য

const result = a || 'fallback value';

যদি ভোটদান aথেকে Booleanআয় false, resultনির্ধারিত হবে'fallback value' , অন্যথায় এর মান a


প্রান্তের ক্ষেত্রে সচেতন হোন a === 0, কোনটি কাস্ট করে falseএবং resultকরবে (ভুলভাবে)'fallback value' । নিজের ঝুঁকিতে এ জাতীয় কৌশলগুলি ব্যবহার করুন।


পুনশ্চ. সুইফ্টের মতো ভাষাতে শূন্য-কোয়েলসিং অপারেটর থাকে ( ??), যা একই উদ্দেশ্যে কাজ করে। উদাহরণস্বরূপ, সুইফ্টে আপনি লিখবেন result = a ?? "fallback value"যা জাভাস্ক্রিপ্টের খুব কাছে closeconst result = a || 'fallback value';


3
পিএইচপি (> .0.০) এবং সি # নাল কোলেসিং অপারেটরকে সমর্থন করে। সিনট্যাকটিক চিনি তবে অবশ্যই ভাল।
হিসওয়ার্ড

5
এটি কেবল তখনই কাজ করে যখন ফাংশনটি মিথ্যা মান দেয় যখন ব্যর্থ হয় তবে indexOf()এই প্যাটার্নে ব্যবহার করা যায় না।
বর্মার

1
সঠিক, তবে তিনি সুনির্দিষ্ট উদাহরণ জিজ্ঞাসা করছেন না> "আবার, উপরের সঠিক প্রশ্নের উত্তর খোঁজছেন না, যখন আপনি যখন বার্ষিকীতে জিনিসগুলি বার বার করতে পারেন তার একটি উদাহরণ" <মনে করুন, তিনি আপনাকে বরং সাধারণ উপায় জিজ্ঞাসা করছেন পুনরাবৃত্তি টেরিনারি প্রতিস্থাপন করুন (ফলাফল = ক? ক: খ)। এবং বার্ষিকী পুনরাবৃত্তি || (ফলাফল = এ || খ)
ল্যুবুমির

2
এটা কি সত্যিই কিভাবে ||জাভাস্ক্রিপ্ট মধ্যে কাজ করে? যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি, তবে এটি অন্যান্য অনেক প্রাথমিক ভাষার চেয়ে আলাদাভাবে কাজ করে (আমি প্রাথমিকভাবে সি এবং এর বংশধরদের ভাবছি [সি ++, জাভা ইত্যাদি]) ​​এমনকি যদি ||জাভাস্ক্রিপ্টে সত্যিই এটি কাজ করে তবে আমি ব্যবহারের বিরুদ্ধে পরামর্শ দেব এই জাতীয় কৌশলগুলি যা রক্ষণাবেক্ষণকারীদের ভাষা সম্পর্কে বিশেষ তাত্পর্য জানতে প্রয়োজন। যদিও কৌশলটি দুর্দান্ত, আমি এটি খারাপ অভ্যাস হিসাবে বিবেচনা করব।
লুডুভিজক

1
এছাড়াও লক্ষ করুন যে প্রশ্নটি মানটির সাথে তুলনা করছে -1। আবার আমি জাভাস্ক্রিপ্ট এবং এর কীর্তিগুলির পক্ষে কথা বলতে পারি না, তবে সাধারণত -1একটি সত্য মূল্য হবে, মিথ্যা নয় এবং তাই আপনার উত্তর প্রশ্নের ক্ষেত্রে কার্যকর হবে না এবং অবশ্যই সাধারণ ক্ষেত্রে নয়, বরং কেবল একটি নির্দিষ্ট ক্ষেত্রে কাজ করবে ( তবে যথেষ্ট সাধারণ) সাব-কেস।
লুডুভিজক

8

একটি এক্সট্র্যাক্ট ভেরিয়েবল রিফ্যাক্টরিং ব্যবহার করুন :

var index = someArray.indexOf(3);
var value = index !== -1 ? index : 0

এর constপরিবর্তে এটি আরও ভাল var। আপনি অতিরিক্ত নিষ্কাশনও করতে পারেন:

const index = someArray.indexOf(3);
const condition = index !== -1;
const value = condition ? index : 0;

বাস্তবে, চেয়ে আরও বেশি অর্থবহ নাম ব্যবহার index, conditionএবং value

const threesIndex = someArray.indexOf(3);
const threeFound = threesIndex !== -1;
const threesIndexOrZero = threeFound ? threesIndex : 0;

"এক্সট্র্যাক্ট ভেরিয়েবল" কী? এটি কি একটি প্রতিষ্ঠিত শব্দ?
পিটার মর্টেনসেন

6

আপনি সম্ভবত একটি coalescing অপারেটর খুঁজছেন। ভাগ্যক্রমে, আমরা Arrayএকটি তৈরির জন্য প্রোটোটাইপটি উত্তোলন করতে পারি:

Array.prototype.coalesce = function() {
    for (var i = 0; i < this.length; i++) {
        if (this[i] != false && this[i] != null) return this[i];
    }
}

[null, false, 0, 5, 'test'].coalesce(); // returns 5

ফাংশনে একটি প্যারামিটার যুক্ত করে এটি আপনার ক্ষেত্রে আরও সাধারণীকরণ করা যেতে পারে:

Array.prototype.coalesce = function(valid) {
    if (typeof valid !== 'function') {
        valid = function(a) {
            return a != false && a != null;
        }
    }

    for (var i = 0; i < this.length; i++) {
        if (valid(this[i])) return this[i];
    }
}

[null, false, 0, 5, 'test'].coalesce(); // still returns 5
[null, false, 0, 5, 'test'].coalesce(function(a){return a !== -1}); // returns null
[null, false, 0, 5, 'test'].coalesce(function(a){return a != null}); //returns false

অ্যারের প্রোটোটাইপ যুক্ত করা ঝুঁকিপূর্ণ, কারণ নতুন উপাদান প্রতিটি অ্যারের অভ্যন্তরে সূচক হয়ে যায়। এই উপায়ে সূচকের মাধ্যমে iterating নতুন পদ্ধতি অন্তর্ভুক্ত যে: for (let x in ['b','c']) console.log(x);কপি করে প্রিন্ট 0, 1, "coalesce"
চার্লি হার্ডিং 21

@ চর্লিহার্ডিং সত্য, তবে অ্যারে দিয়ে লুপিং করার সময় সাধারণত ইন-অপারেটর ব্যবহার করার পরামর্শ দেওয়া হয় না। দেখুন stackoverflow.com/a/4374244/1486100
Tyzoid

6

আমি ব্যক্তিগতভাবে দুটি রূপ পছন্দ করি:

  1. খালি, যদি @ স্লেবেটম্যান পরামর্শ দেয়

  2. পৃথক ফাংশন, যা এই উদাহরণের মতো ডিফল্টর সাথে অবৈধ মানকে প্রতিস্থাপন করে:

function maskNegative(v, def) {
  return v >= 0 ? v : def;
}

Array.prototype.indexOfOrDefault = function(v, def) {
  return maskNegative(this.indexOf(v), def);
}

var someArray = [1, 2];
console.log(someArray.indexOfOrDefault(2, 0)); // index is 1
console.log(someArray.indexOfOrDefault(3, 0)); // default 0 returned
console.log(someArray.indexOfOrDefault(3, 123)); // default 123 returned


1
+1, বিকল্প 2 প্রশ্নের অন্তর্নিহিত উদ্দেশ্যকে সম্মান করে, জাভাস্ক্রিপ্টের চেয়ে অন্য ভাষাগুলিতে দক্ষতার সাথে প্রয়োগ করতে পারে এবং মড্যুলারটির প্রচার করে।
ডিভসম্যান

5

আমি @ slebetman এর উত্তর পছন্দ করি। এর নীচে দেওয়া মন্তব্যটি একটি "মধ্যবর্তী অবস্থায়" থাকা পরিবর্তনশীল সম্পর্কে উদ্বেগ প্রকাশ করে। যদি এটি আপনার পক্ষে একটি বড় উদ্বেগ হয় তবে আমি এটি কোনও ফাংশনে এটি সজ্জিত করার পরামর্শ দিচ্ছি:

function get_value(arr) {
   var value = arr.indexOf(3);
   if (value === -1) {
     value = 0;
   }
   return value;
}

তারপরে শুধু ফোন করুন

var value = get_value( someArray );

আপনি যদি অন্য জায়গায় তাদের ব্যবহার করে থাকেন তবে আপনি আরও জেনেরিক ফাংশন করতে পারেন, তবে এটি খুব নির্দিষ্ট ক্ষেত্রে যদি অতিরিক্ত প্রকৌশলী না হন।

তবে সত্যি কথা বলতে আমি কেবল স্লিবেটম্যান হিসাবে কাজ করব যদি না আমার বেশ কয়েকটি জায়গা থেকে পুনরায় ব্যবহারের প্রয়োজন হয়।


4

আপনার প্রশ্নটি দেখার জন্য আমি দুটি উপায় দেখতে পাচ্ছি: আপনি হয় লাইনের দৈর্ঘ্য হ্রাস করতে চান, বা আপনি বিশেষত কোনও ত্রৈমাসিকের কোনও ভেরিয়েবল পুনরাবৃত্তি করা এড়াতে চান। প্রথমটি তুচ্ছ (এবং অন্যান্য অনেক ব্যবহারকারী উদাহরণ পোস্ট করেছেন):

var value = someArray.indexOf(3) !== -1 ? someArray.indexOf(3) : 0;

এর মতো সংক্ষিপ্ত করে (এবং ফাংশন কল দেওয়া উচিত) হতে পারে:

var value = someArray.indexOf(3);
value = value !== -1 ? value : 0;

আপনি যদি এমন আরও জেনেরিক সমাধানের সন্ধান করছেন যা কোনও ত্রৈমাসিকের ক্ষেত্রে কোনও ভেরিয়েবলের পুনরাবৃত্তি রোধ করে, যেমন:

var value = conditionalTest(foo) ? foo : bar;

যেখানে fooকেবল একবার উপস্থিত হয়। ফর্মের সমাধানগুলি বাতিল করা হচ্ছে:

var cad = foo;
var value = conditionalTest(foo) ? cad : bar;

প্রযুক্তিগতভাবে সঠিক হিসাবে তবে পয়েন্টটি অনুপস্থিত, তবে আপনার ভাগ্য নেই। এমন অপারেটর, ফাংশন এবং পদ্ধতি রয়েছে যা আপনার সন্ধানের সংশ্লেষের অধিকারী, তবে সংজ্ঞা অনুসারে এ জাতীয় নির্মাণগুলি ত্রৈমাসিক অপারেটর নয়

উদাহরণ:

জাভাস্ক্রিপ্ট, ||যখন এলএইচএস হয় তখন আরএইচএস ফেরত ব্যবহার করে falsey:

var value = foo || bar; // equivalent to !foo ? bar : foo

1
প্রশ্নটি জাভাস্ক্রিপ্ট ট্যাগ করা এবং সি # উল্লেখ করে না। আপনি কেন সি # নির্দিষ্ট উদাহরণ দিয়ে শেষ করছেন তা অবাক করেই ভাবছেন।
লুডুভিজক

আমি প্রশ্নের জাভাস্ক্রিপ্ট ট্যাগ মিস করেছি; সি # সরানো হয়েছে।
asgallant

3

একটি সহায়ক ফাংশন ব্যবহার করুন:

function translateValue(value, match, translated) {
   return value === match ? translated : value;
}

এখন আপনার কোডটি খুব পঠনযোগ্য এবং কোনও পুনরাবৃত্তি নেই।

var value = translateValue(someArray.indexOf(3), -1, 0);

কোডিং উদ্বেগের শ্রেণিবিন্যাস হ'ল:

  1. সঠিক (সত্য পারফরম্যান্স বা এসএলএ উদ্বেগ সহ)
  2. স্পষ্ট
  3. সংক্ষিপ্ত
  4. দ্রুত

এখন পর্যন্ত পৃষ্ঠায় থাকা সমস্ত উত্তর সঠিক বলে মনে হয়েছে, তবে আমি মনে করি আমার সংস্করণটিতে সর্বাধিক স্পষ্টতা রয়েছে, যা সংক্ষিপ্ততার চেয়ে গুরুত্বপূর্ণ। আপনি যদি সহায়তা সহায়কটিকে গণনা না করেন - যেমন এটি পুনরায় ব্যবহার করা যায় — এটিও সবচেয়ে সংক্ষিপ্ত। সহায়ক ফাংশনটি ব্যবহার করার জন্য কিছুটা অনুরূপ পরামর্শ দুর্ভাগ্যক্রমে একটি ল্যাম্বডা ব্যবহার করে যা আমার কাছে, এটি কী করছে তা কেবল অস্পষ্ট করে। একটি উদ্দেশ্য সহ একটি সরল ফাংশন যা ল্যাম্বডা নেয় না, কেবল মানগুলি, আমার কাছে আরও ভাল much

পিএস আপনি যদি ES6 সিনট্যাক্স পছন্দ করেন:

const translateValue = (value, match, translated) => value === match ? translated : value;
let value = translateValue(someArray.indexOf(3), -1, 0); // or const

2
"আমার সংস্করণে সর্বোচ্চ স্পষ্টতা রয়েছে" - আমি একমত নই। ফাংশনটির নামটি অনেক দীর্ঘ এবং পরামিতিগুলির নামকরণ ইনপুট এবং আউটপুট মোটেই সহায়ক নয়।
অ্যাডেলফাস

সুতরাং আপনি আরও ভাল নাম প্রস্তাব করতে পারেন? আমি তাদের বিনোদন আনন্দিত হবে। আপনার অভিযোগটি কেবলমাত্র প্রসাধনী সম্পর্কে, সুতরাং আসুন প্রসাধনীগুলি ঠিক করুন। রাইট? অন্যথায় আপনি কেবল বাইক চালাচ্ছেন।
এরিক

কিছু ক্ষেত্রে, এই জাতীয় সহায়ক ফাংশন দরকারী হতে পারে। এই ক্ষেত্রে, যেখানে এটি কেবলমাত্র টার্নারি অপারেটরের নির্দিষ্ট ক্ষেত্রে প্রতিস্থাপন করছে, আপনার কার্যকারিতা কম পরিষ্কার হবে less আপনার ফাংশনটি কী করে তা আমি স্মরণ করতে যাচ্ছি না এবং প্রতিবার যখনই এটিটি আসবে তখন আমাকে আবার এটি সন্ধান করতে হবে এবং আমি এটি কখনই ব্যবহার করতে চাইব না remember
লুডুভিজক

1
@ অ্যারন এটি কোনও নির্দিষ্ট ব্যবহারের ক্ষেত্রে যুক্তিসঙ্গত মূল্যায়ন। এটির মূল্যের জন্য, আমার আসল ফাংশনটির নামটি translateValueIfEqualআমি বেশি বর্ণনামূলক বলে মনে করেছি, তবে কেউ এটি দীর্ঘ বলে মনে হওয়ার পরে আমি এটি পরিবর্তন করেছি। Nzঅ্যাক্সেসের ফাংশনটির মতো , যদি আপনি এটি জানেন, আপনি এটি জানেন, এবং যদি আপনি না করেন তবে আপনি করবেন না। আধুনিক আইডিইগুলিতে আপনি সংজ্ঞাটিতে ঝাঁপ দেওয়ার জন্য একটি কী টিপতে পারেন। এবং ফলব্যাক হবে মধ্যবর্তী পরিবর্তনশীল। আমি এখানে সত্যিই একটি বড় ডাউন-সাইড দেখতে পাচ্ছি না।
এরিক

1
এটি কেবল এটি দেখানোর জন্য যায় যে আপনি 5 জন ভিন্ন প্রকৌশলীকে একই প্রশ্ন জিজ্ঞাসা করলে আপনি 10 টি বিভিন্ন উত্তর পেয়ে যাবেন।
লুডুভিজক

2

আমি মনে করি ||অপারেটরটি এটি অনুসারে তৈরি করা যেতে পারে indexOf:

var value = ((someArray.indexOf(3) + 1) || 1) - 1;

প্রত্যাবর্তিত মান 1 দ্বারা স্থানান্তরিত হয়, 0 -1 থেকে 0 তৈরি করে যা মিথ্যা এবং তাই দ্বিতীয়টি 1 দ্বারা প্রতিস্থাপিত হয় Then তারপরে এটি আবার স্থানান্তরিত হয়।

তবে, দয়া করে মনে রাখবেন যে পুনরাবৃত্তি এড়ানোর চেয়ে পাঠযোগ্যতা সর্বোত্তম।


2

এটি বিটওয়াইজ নট এবং একটি ডিফল্ট মান সহ একটি সহজ সমাধান -1যার ফলাফল পরে শূন্য হয়।

index = ~(~array.indexOf(3) || -1);

এটি মূলত ডাবল বিটওয়াইজ নট দিয়ে কাজ করে যা মূল মান বা একটি ডিফল্ট মান দেয় যা বিটওয়াইজ নোট প্রয়োগের পরে শূন্য ফেরত দেয় না।

আসুন সত্যের টেবিলে এক নজর দেওয়া যাক:

 indexOf    ~indexOf   boolean    default     value      result         comment
---------  ---------  ---------  ---------  ---------  ---------  ------------------
      -1          0     falsy          -1         -1          0   take default value
       0         -1    truthy                     -1          0
       1         -2    truthy                     -2          1
       2         -3    truthy                     -3          2

0

আপনি পুনরায় নিয়োগ ব্যবহার করতে পারেন:

  • ভেরিয়েবলকে একটি মান থেকে আরম্ভ করুন
  • &&পুনরায় নিয়োগের জন্য অপারেটরের সিরিয়ালাইজেশন ব্যবহার করুন , কারণ যদি প্রথম শর্তটি মিথ্যা হয়, তবে দ্বিতীয় প্রকাশটি মূল্যায়ন করা হবে না

যাত্রা।

var value = someArray.indexOf(3);
value == -1 && (value=0);


3
@ মাইনাসফোর একটি ডিগ্রি পর্যন্ত। পরিবর্তনশীলটি পুনরাবৃত্তি হয়, someArray.indexOfকেবলমাত্র
প্রকাশটিই

আপনি পুনরাবৃত্তি value
মাইনাসফোর

3
@ মাইনাসফোর সঠিক, তবে এটি বৃহত্তর অভিব্যক্তির জন্য আরও কার্যকর, অপসকে সংরক্ষণের তুলনায় একটি ভেরিয়েবলের পুনরাবৃত্তি করা নগণ্য। আমার অনুমান যে ওপি কাজ করছে না -1এবং 0; অন্যথায় max()সেরা বিকল্পটি হবে
vol7ron

2
ঠিক আছে ... তবে প্রশ্নটি ... " নিজেকে পুনরাবৃত্তি না করে কিভাবে
টের্নারিগুলি লিখবেন

4
এটি আরও বলেছে Again, not seeking an answer to the exact question above, যা প্রশ্নকে ব্যাখ্যা করার জন্য ফেলে দেয়;)
ভলিউরন

0

প্রশ্নে উদাহরণ কোড দেওয়া হলেও এটি কীভাবে নির্ধারিত হবে তা পরিষ্কার নয় 3 হয় বা সূচিতে সেট না করা হয় 0এর someArray। একটি ম্যাচ হতে পারে এমন একটি অনুমানযুক্ত ম্যাচ বাদ দেওয়ার উদ্দেশ্যে, এ -1থেকে ফিরে আসা .indexOf()মূল্যবান হতে পারে।

যদি 3অ্যারের মধ্যে অন্তর্ভুক্ত করা হয় না, -1ফেরত পাঠানো হবে। আমরা যোগ করতে পারেন 1ফলাফলের সাথে প্রাসঙ্গিক .indexOf()যেমন নির্ণয় করা falseফলাফলের থাকার জন্য -1, যেখানে দ্বারা অনুসরণ || ORঅপারেটর এবং0 । যখন valueরেফারেন্স করা হয়, 1অ্যারের এলিমেন্টের সূচক পেতে বিয়োগ করুন বা -1

যা কেবলমাত্র কোনও শর্তে ব্যবহার .indexOf()এবং চেক করার দিকে ফিরে যায় । বা, মূল রেফারেন্স সম্পর্কিত মূল্যায়িত অবস্থার প্রকৃত ফলাফল হিসাবে সম্ভাব্য বিভ্রান্তি এড়াতে হিসাবে সংজ্ঞা দেওয়া হচ্ছে ।-1ifvalueundefined

var someArray = [1,2,3];
var value = someArray.indexOf(3) + 1 || 1;
console.log(value -= 1);

var someArray = [1,2,3];
var value = someArray.indexOf(4) + 1 || 1;
// how do we know that `4` is not at index `0`?
console.log(value -= 1);

var someArray = [1,2,3];
var value = someArray.indexOf(4) + 1 || void 0;
// we know for certain that `4` is not found in `someArray`
console.log(value, value = value || 0);


0

একটি টেরিনারি হ'ল যদি-অন্যরকম, আপনার যদি অন্য অংশের প্রয়োজন না হয় তবে পরিবর্তে যদি কেবল একটি একক কেন হয় না ..

if ((value = someArray.indexOf(3)) < 0) value = 0;

0

এই বিশেষ ক্ষেত্রে, আপনি লজিকাল ||অপারেটরের সাথে শর্ট সার্কিট ব্যবহার করতে পারেন । 0মিথ্যা হিসাবে বিবেচিত হিসাবে , আপনি 1আপনার সূচীতে যুক্ত করতে পারেন , সুতরাং যদি index+1হয় 0তবে আপনি যৌক্তিকের ডান হাত পাবেন - বা ফলস্বরূপ, অন্যথায়, আপনি পাবেন index+1। আপনার পছন্দসই ফলাফলটি অফসেট হওয়ার সাথে সাথে আপনি নিজের সূচকটি পেতে এটি থেকে 1বিয়োগ করতে পারেন 1:

const someArray = [1, 2, 3, 4];
const v = ((someArray.indexOf(3)+1) || 1)-1;
console.log(v);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.