মানগুলির তালিকার বিপরীতে পরিবর্তনশীল সমতা পরীক্ষা করে দেখুন


133

আমি একটি ভেরিয়েবল যাচাই করছি, বলুন foo, বিভিন্ন মানের মধ্যে সমতার জন্য। উদাহরণ স্বরূপ,

if( foo == 1 || foo == 3 || foo == 12 ) {
    // ...
}

মুল বক্তব্যটি হ'ল এ জাতীয় তুচ্ছ কাজের জন্য এটি বরং অনেক কোড। আমি নিম্নলিখিত নিয়ে এসেছি:

if( foo in {1: 1, 3: 1, 12: 1} ) {
    // ...
}

তবে এটি আমার কাছে সম্পূর্ণ আবেদন করে না, কারণ আমাকে অবজেক্টের আইটেমগুলিতে অনর্থক মান দিতে হবে।

একাধিক মূল্যবোধের বিপরীতে সমতা যাচাই করার কোনও শালীন উপায় কি কেউ জানেন?


আমি মনে করি এরকম কিছু সিদ্ধান্ত নেওয়ার সময় বৃহত্তর প্রসঙ্গটি জড়িত হওয়া দরকার কারণ আপনি কেন এই ধরনের তুলনা করছেন তা জানা গুরুত্বপূর্ণ ।
পয়েন্টটি

ভাল, একটি গেমের মধ্যে আমি তৈরি করছি আমি কীবোর্ড কোডগুলি যাচাই করছি যাতে কোন ফাংশনটি ডাকা উচিত তা স্থির করে। বিভিন্ন ব্রাউজারে, একটি কীতে বিভিন্ন কী কোডগুলি উপস্থিত থাকে, তাই একাধিক মানের সাথে তুলনা করা দরকার।
pimvdb

একাধিক পদ্ধতির জন্য পারফরম্যান্স পরীক্ষা পরীক্ষা করুন, লজিকাল অপারেটর রানকিট.com
pramendra/

উত্তর:


175

আপনি একটি অ্যারে ব্যবহার করতে পারেন এবং indexOf:

if ([1,3,12].indexOf(foo) > -1)

1
আমার এটা ভাল লেগেছে. এমনকি আমার অনুমানযোগ্য প্রোটোটাইপের মাধ্যমে একটি 'অন্তর্ভুক্ত' ফাংশন তৈরি করাও সম্ভব হবে, যাতে> -1 এর ব্যবহার বাদ দেওয়া যায়।
pimvdb

1
@ পিমভিডিবি: নোট করুন যে আপনার নিজের প্রয়োগের প্রয়োজন হতে পারে কারণ indexOfএটি কেবলমাত্র ECMAScript 5 তম সংস্করণ থেকে পাওয়া যায়।
গম্বো

অন্য উত্তরে
এটিও

'>' কোনওরকম '! ==' এর চেয়ে ভাল?
সর্বোচ্চ ওয়াটারম্যান

117

ECMA2016 এ আপনি অন্তর্ভুক্ত পদ্ধতিটি ব্যবহার করতে পারেন । এটি আমি সবচেয়ে পরিষ্কারভাবে দেখেছি। (IE ব্যতীত সমস্ত বড় ব্রাউজার দ্বারা সমর্থিত (পলিফিল লিঙ্কটিতে রয়েছে)

if([1,3,12].includes(foo)) {
    // ...
}

4
ভেরিয়েবল if([a,b,c].includes(foo))বা স্ট্রিংয়ের জন্যif(['a','b','c'].includes(foo))
হাসটিগ জুসামেনস্টেলেন

ভেরিয়েবলের জন্য => if([a,b,c].includes(foo))কারণ উদ্ধৃতি চিহ্ন এটি স্ট্রিং করে দেবে। @ হাসটিগজুসামেনস্টেলেলেন
আইম্বিনোডস্টা

2
@ বিনোদশ্রেষ্টা আমি মনে করি এটিই আমি লিখেছিলাম, যদি না আমি কিছু মিস করি। "পরিবর্তনশীল .. বা স্ট্রিংগুলির জন্য ..."
হাস্টিগ জুসামেনস্টেলেন

16

প্রদত্ত উত্তরগুলি ব্যবহার করে, আমি নিম্নলিখিতগুলি দিয়ে শেষ করেছি:

Object.prototype.in = function() {
    for(var i=0; i<arguments.length; i++)
       if(arguments[i] == this) return true;
    return false;
}

এটি এর মতো বলা যেতে পারে:

if(foo.in(1, 3, 12)) {
    // ...
}

সম্পাদনা: আমি এই 'ট্রিক'টি ইদানীং এসেছি যা মানগুলি যদি স্ট্রিং হয় এবং বিশেষ অক্ষর না থাকে তবে তা কার্যকর। বিশেষ চরিত্রগুলির জন্য পালানোর কারণে কুরুচিপূর্ণ হয়ে ওঠে এবং এর কারণে আরও ত্রুটি-প্রবণ হয়।

/foo|bar|something/.test(str);

আরও সুনির্দিষ্ট হওয়ার জন্য, এটি সঠিক স্ট্রিংটি যাচাই করবে, তবে এটি আবার সাধারণ জটিলতার পরীক্ষার জন্য আরও জটিল:

/^(foo|bar|something)$/.test(str);

5
ধার্মিকতা! আমি অবাক হয়েছি যে কাজ করে - inজাভাস্ক্রিপ্টের একটি কীওয়ার্ড। উদাহরণস্বরূপ, function in() {}; in()কমপক্ষে ফায়ারফক্সে সিন্ট্যাক্স ত্রুটিতে চলমান ফলাফল, এবং আপনার কোডটি কেন হয় না তা আমি নিশ্চিত নই। :-)
বেন ফাঁকা 18

3
এছাড়াও, এটি প্রায়শই খারাপ অভ্যাসটিকে প্রসারিত Object.prototypeহিসাবে বিবেচনা করা হয় , কারণ এটি for (foo in bar)দুর্ভাগ্যজনক উপায়ে প্রভাবিত করে। সম্ভবত এটিতে পরিবর্তন করুন function contains(obj) { for (var i = 1; i < arguments.length; i++) if (arguments[i] === obj) return true; return false; }এবং একটি আর্গুমেন্ট হিসাবে বস্তুটি পাস করুন?
বেন ফাঁকা

আপনার প্রতিক্রিয়াটির জন্য ধন্যবাদ, এবং গুগল ক্লোজার কম্পাইলারও এই কোডটি নিজেই সুন্দরভাবে কাজ করার সময় সংকলন করার সময় একটি ত্রুটি প্রদান করে। যাইহোক, এটি পরামর্শ দেওয়া হয়েছে যে কোনও সহায়ক শ্রেণি এই কাজটি আরও ভাল Object.prototypeকরতে পারে যেমন আপনি উল্লেখ করেছেন extend যাইহোক, আমি এই উপায়ে পছন্দ করি না, কারণ চেক করার জন্য স্বরলিপিটি foo.in(1, 2, "test", Infinity)পাইয়ের মতো সুন্দর, ন্যায় , সহজ।
pimvdb

এবং কোনও ক্রিয়াকলাপটিকে in()নিয়মিতভাবে সংজ্ঞায়িত করা
ক্রোমেও

3
অবজেক্ট.প্রোটোটাইপ প্রসারিত করা একটি অ্যান্টি-প্যাটার্ন এবং ব্যবহার করা উচিত নয়। পরিবর্তে একটি ফাংশন ব্যবহার করুন।
ভার্নন 10

9

আপনি if(foo in L(10,20,30))যদি সংজ্ঞায়িত Lহন তবে আপনি লিখতে পারেন

var L = function()
{
    var obj = {};
    for(var i=0; i<arguments.length; i++)
        obj[arguments[i]] = null;

    return obj;
};

এটি আসলে পূর্বের উত্তরগুলির চেয়ে আরও স্পষ্ট, ধন্যবাদ!
pimvdb

2
আমি মনে করি যে প্রোটোটাইপ ফাংশনগুলিও একটি অ্যারে / অবজেক্টে 'ইন' রয়েছে - এই মন্তব্য করা বুদ্ধিমানের কাজ - সুতরাং যদি কোনও অ্যারে / অবজেক্টের প্রোটোটাইপে কোনও 'অপসারণ' ফাংশন থাকে তবে আপনি কোড দিলে সর্বদা সত্য ফিরে আসবে 'remove' in L(1, 3, 12), যদিও আপনি তা করেননি তালিকায় রাখতে 'অপসারণ' নির্দিষ্ট করুন।
pimvdb

7

এটি সহজেই প্রসারিত এবং পাঠযোগ্য:

switch (foo) {
    case 1:
    case 3:
    case 12:
        // ...
        break

    case 4:
    case 5:
    case 6:
        // something else
        break
}

তবে অগত্যা সহজ নয় :)


আমি মূলত এই পদ্ধতিটি ব্যবহার করেছি কারণ প্রতিটি মানের পাশে যে কোনও মানটি কী সম্পর্কিত তা বর্ণনা করার জন্য একটি মন্তব্য রাখতে চেয়েছিলাম, এটি এটি অর্জনের সবচেয়ে পাঠযোগ্য উপায়।
ফোলক্রফট

@ ফলক্রফট যদি আপনার প্রতিটি মানটির সাথে কী সম্পর্কযুক্ত তা বর্ণনা করতে হবে তবে একটি এনাম বা শ্রেণি তৈরি করা উচিত এবং বর্ণনামূলক নাম রাখতে নিজের সম্পত্তি লিখতে হবে।
red_dorian

6
var a = [1,2,3];

if ( a.indexOf( 1 ) !== -1 ) { }

নোট করুন যে সূচিপত্র মূল ECMAScript এ নেই। আইই এবং আপনার সম্ভবত অন্য ব্রাউজারগুলির জন্য একটি স্নিপেট থাকা দরকার যা অ্যারে.প্রোটোটাইপ.ইন্ডেক্সফ সমর্থন করে না।

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(searchElement /*, fromIndex */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (len === 0)
      return -1;

    var n = 0;
    if (arguments.length > 0)
    {
      n = Number(arguments[1]);
      if (n !== n)
        n = 0;
      else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
    }

    if (n >= len)
      return -1;

    var k = n >= 0
          ? n
          : Math.max(len - Math.abs(n), 0);

    for (; k < len; k++)
    {
      if (k in t && t[k] === searchElement)
        return k;
    }
    return -1;
  };
}

এটি সরাসরি মোজিলার অনুলিপি। লিঙ্ক করতে খুব অলস ছিল। বিকাশকারী.মোজিলা.আর.ইন
জাভাস্ক্রিপ্ট / রেফারেন্স

আপনি যখন বিটগুলি স্থানান্তরিত করছেন না, যখন আপনি লেনটি সংজ্ঞায়িত করেন তখন কি বিটশিফ্টের কোনও কারণ আছে? এখানে কিছু জড়িত জবরদস্তি চলছে?
jaread7

3

এছাড়াও, যে মানগুলির বিরুদ্ধে আপনি ফলাফলটি যাচাই করছেন তা সমস্ত অনন্য হওয়ায় আপনি সেট.প্রোটোটাইপ.হ্যাস ()ও ব্যবহার করতে পারেন ।

var valid = [1, 3, 12];
var goodFoo = 3;
var badFoo = 55;

// Test
console.log( new Set(valid).has(goodFoo) );
console.log( new Set(valid).has(badFoo) );


2

এই দৃশ্যের সমাধানের জন্য আপনার কাছে এখন আরও ভাল সমাধান হতে পারে তবে আমি পছন্দ করেছি অন্যভাবে।

const arr = [1,3,12]
if( arr.includes(foo)) { // it will return true if you `foo` is one of array values else false
  // code here    
}

আমি সূচকের চেয়ে উপরে সমাধানটিকে পছন্দ করেছি তবে আপনাকে যেখানে সূচিও পরীক্ষা করতে হবে তা পরীক্ষা করে দেখুন।

ডকস অন্তর্ভুক্ত

if ( arr.indexOf( foo ) !== -1 ) { }

1

আমি গৃহীত উত্তরটি পছন্দ করেছি, তবে ভেবেছিলাম এটি খুব ভালভাবে অ্যারে নিতে সক্ষম হবে তবে আমি এটিকে এটিতে প্রসারিত করেছি:

Object.prototype.isin = function() {
    for(var i = arguments.length; i--;) {
        var a = arguments[i];
        if(a.constructor === Array) {
            for(var j = a.length; j--;)
                if(a[j] == this) return true;
        }
        else if(a == this) return true;
    }
    return false;
}

var lucky = 7,
    more = [7, 11, 42];
lucky.isin(2, 3, 5, 8, more) //true

আপনি পরিবর্তন করে জাভাস্ক্রিপ্টের এই মাতব্বরী অপসারণ করতে পারেন ==থেকে ===


1

আপনার যদি অ্যান্ডস্কোরটিতে অ্যাক্সেস থাকে তবে আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

if (_.contains([1, 3, 12], foo)) {
  // ...
}

contains লোডাশেও (ভি 4 এর পূর্বে) কাজ করার জন্য ব্যবহৃত হত, এখন আপনাকে ব্যবহার করতে হবে includes

if (_.includes([1, 3, 12], foo)) {
  handleYellowFruit();
}

1

এটি একটি সামান্য সহায়ক তীরচিহ্ন ফাংশন:

const letters = ['A', 'B', 'C', 'D'];

function checkInList(arr, val) {
  return arr.some(arrVal => val === arrVal);
}

checkInList(letters, 'E');   // false
checkInList(letters, 'A');   // true

আরও তথ্য এখানে ...


খুব ভাল দৃষ্টিভঙ্গি: আপনার ধারণা থেকে শুরু করে আপনি এটি কোনও সাহায্যকারী ফানসিওন ছাড়াও করতে পারেন:const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].some(option => option === valToCheck); // false
জর্জিও টেম্পেস্টা

তবে একবার আমি কোডটি টুইট করতে শুরু করেছি যে আমি খুঁজে পেয়েছি যে includesএটি আরও ভাল বিকল্প হয়ে উঠেছে, @ অ্যালিসারের উত্তর হিসাবে:const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].includes(valToCheck); // false
জর্জিও টেম্পেস্টা

0

আমি এটিকে সম্পাদন করার জন্য সহজভাবে jQuery ইনআরে ফাংশন এবং মানগুলির একটি অ্যারে ব্যবহার করেছি :

myArr = ["A", "B", "C", "C-"];

var test = $.inArray("C", myArr)  
// returns index of 2 returns -1 if not in array

if(test >= 0) // true

-4

উত্তরোত্তর জন্য আপনি বিকল্প হিসাবে নিয়মিত এক্সপ্রেশন ব্যবহার করতে চাইতে পারেন। বেশ ভাল ব্রাউজার সমর্থনও (রেফার্স https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / স্ট্রিং / ম্যাচ# ব্রাউজার_কম্প্যাটিবিলিটি )

এটা চেষ্টা কর

if (foo.toString().match(/^(1|3|12)$/)) {
    document.write('Regex me IN<br>');
} else {
    document.write('Regex me OUT<br>');
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.