এবং একাধিক পরামিতি


15
function andMultipleExpr(){
  let logicalAnd;
  let i;
  for (i = 0; i < arguments.length; i++){
    logicalAnd =  arguments[i] && arguments[i+1];
  }
  return logicalAnd;
}

console.log(andMultipleExpr(true, true, false, false));

আমি কি আশা করছি এই কোড চালানো হল: সত্য && সত্য && মিথ্যা && মিথ্যা এবং যে ফেরত পাঠাবেন মিথ্যা

জেএস-এ সেই কাজটি কীভাবে করবেন? ধন্যবাদ


আমি কেবল দ্বিধা বোধ করছি। আমার ধারণাটি সঠিকভাবে প্রস্তুত করা হয়েছে কিনা তা নিশ্চিত হতে চাই। আরও ভাল উপায় যদি থাকে, দয়া করে পরামর্শ দিন।
হাকিম আসা

বুলিয়ানগুলির পরিবর্তে ট্রুথি মানগুলি ব্যবহৃত হলে আউটপুটটি কী হওয়া উচিত? যেমন andMultipleExpr(1, 1, 0, 0)বাandMultipleExpr(1, 1, 1, 1)
নিক জৌম

এছাড়াও andMultipleExpr()(কোন পরামিতি ছাড়া ফাংশন কল করা) এর আউটপুট কী হওয়া উচিত ?
নিক জোউম

ভাল, এই ক্ষেত্রেগুলিও আমলে নেওয়া দরকার। :-)
হাকিম আসা

উত্তর:


16

Array.prototype.everyএগুলি সমস্ত সত্য কিনা তা যাচাই করতে সমস্ত পাস হওয়া যুক্তি ব্যবহার করুন;

function andMultipleExpr(...a) {
  if(a.length === 0) return false; // return false when no argument being passed
  return a.every(Boolean);
}

console.log(andMultipleExpr(true, true, false)); // should return false
console.log(andMultipleExpr(true, true, true)); // should return true


এর e => e === trueসাথে প্রতিস্থাপন করতে পারেBoolean
নিক জোউম

@ নিকজৌম এটি সমস্ত সত্যবাদী মানের সাথে মিলবে, ওপি কঠোরভাবে তুলনা করছে true
আরচি

1
@ আর্চি - না, তারা সত্যবাদী / মিথ্যা তুলনা করছে। ===ওপির কোডটিতে কোনও নেই । যদিও আপনার everyধারণাটি স্পট রয়েছে । তবে শুধু .every(e => e)কাজটি করে।
টিজে ক্রাউডার

@ টিজে ক্রাউডার হ্যাঁ এটি কেবল লক্ষ্য করেছে। ইতিমধ্যে উত্তর আপডেট করেছেন। ধন্যবাদ :)
আরচি

আপনি যদি কোনও সহায়ক ফাংশন যুক্ত করেন: const isTrue = x => x === true(বা x => !!xসমস্ত সত্য মানের জন্য), আপনি নিজের সমাধানটি সংকোচন করতে পারেন return arguments.every(isTrue)। যা আমার কাছে খুব সুন্দর মনে হচ্ছে।
mbojko

9

তোমার দরকার

  1. logicalAndসেট দিয়ে শুরু করুনtrue

  2. ব্যবহার করুন logicalAndযখন এটি আপডেট, বরং দুই এন্ট্রি ব্যবহার না করেarguments

সর্বনিম্ন পরিবর্তনটি হ'ল:

function andMultipleExpr(){
    let logicalAnd = true; // ***
    let i;
    for (i = 0; i < arguments.length; i++){
        logicalAnd = logicalAnd && arguments[i]; // ***
    }
    return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));

তবে এমবোজকো সলিউশনে শর্ট সার্কিট করার সুবিধা রয়েছে (লুপটি প্রথমে যখন একটি মিথ্যা মান খুঁজে পাওয়া যায় তখন থামানো হয়), এটি একটি ভাল ধারণা বলে মনে হয়।

যেহেতু আপনি ES2015 + ব্যবহার করছেন, আপনার সম্ভবত এটির চেয়ে বিশ্রামের প্যারামিটারটি ব্যবহার করা উচিত argumentsএবং আপনি একটি for-ofলুপ ব্যবহার করতে পারেন :

function andMultipleExpr(...flags) {
    let logicalAnd = true;
    for (const flag of flags) {
        logicalAnd = logicalAnd && flag;
    }
    return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));

আপনি mbojko এর পদ্ধতির সাথে মিল রেখে শর্ট সার্কিটও করতে পারেন

function andMultipleExpr(...flags) {
    for (const flag of flags) {
        if (!flag) {
            return false;
        }
    }
    return true;
}
console.log(andMultipleExpr(true, true, false, false));

কিছু লোক এটি লক্ষ্য করতে পারে reduceতবে আর্চির everyসমাধানটি আরও ভাল। (তবে যেহেতু আপনার তুলনাটি কঠোর নয়, আমি কেবল এটি তৈরি করব .every(flag => flag)))


1
ধন্যবাদ। এটি আমার কাছে আরও অর্থবোধ করে :-)
হাকিম আস আস

এই ক্ষেত্রে হ্রাস বিবৃতিতে দ্বিতীয় প্যারামিটার যুক্ত করার দরকার নেই, ডিফল্টরূপে প্রথম প্যারামিটার পাওয়াও কাজ করবে।
নিক জৌম

1
@ নিকজৌম - কেবলমাত্র যদি আমরা ধরে নিতে পারি যে ফাংশনটি কোনও যুক্তি ছাড়াই ডাকা হবে না, যেহেতু [].reduce((a,b)=>a && b)ছুড়ে ফেলেছে ।
টিজে ক্রাউডার

6

প্রারম্ভিক রিটার্নগুলির কোডটি আরও দক্ষ এবং খাটো উভয়ই করা উচিত:

function andMultipleExpr() {
  for (let i = 0; i < arguments.length; i++) {
    if (!arguments[i]) {
      return false;
    }
  }

  return true;
}

4

আমি মনে করি এটি ES6 ব্যবহারের খুব ছোট উপায় Array.prototype.reduce

let andMultipleExpr = (...args) => args.reduce((a, b) => a && b);

console.log(andMultipleExpr(true, true, false, false));

ফাংশন হ্রাস সম্পর্কে আরও ব্যাখ্যার জন্য, দয়া করে MDN পড়ুন


আপনি একটি অ্যারের পদ্ধতি ব্যবহার করছে থাকেন, তবে এটা অনেক ব্যবহার করা ভাল everyমত আর্চি করেনি তুলনায় reduce। সহজ, এবং এটি শর্ট সার্কিট।
টিজে ক্রাউডার

এটা সত্য. তবে আসুন আমরা এখনই থাকি তিনি চাই কেবলমাত্র লোগিক বা || এখন কমাতে, এটা ঠিক পরিবর্তন হতে হবে && করার ||
প্যাট্রিসল কেনফ্যাক

বা everyকরতে some। এখনও সহজ। এখনও শর্ট সার্কিট।
টিজে ক্রাউডার

সাবাশ. আপনি ঠিকই আছেন
@ টিজে

3

আপনি নিতে Array#everyএবং শেষ মানটি ফিরিয়ে দিতে পারেন ।

এই পদ্ধতির মাধ্যমে লজিক্যাল এন্ডের&& আসল ফলাফলটি ফিরে আসে ।

পদ্ধতির ব্যবহার করে, প্রথম পাওয়া মিথ্যা মানটির জন্য একটি শর্ট সার্কিট তৈরি করা হয়। তারপরে পুনরাবৃত্তি থামে।

function andMultipleExpr(...args) {
    var result; // any return value is configurable for empty args
    args.every(v => result = v);
    return result;
}

console.log(andMultipleExpr(true, true, false, false));
console.log(andMultipleExpr(true, true, 1, 2));
console.log(andMultipleExpr(true, 0, 1, 2));


3

লুপটিতে কী ভুল হয়েছে তা আপনি শুনতে চান:

for (i = 0; i < arguments.length; i++){
  logicalAnd =  arguments[i] && arguments[i+1];
}
  1. এই লুপটি &&শেষ দুটি আইটেমের মুখোমুখি হয়। আদর্শ ক্ষেত্রে এটি &&অ্যারের শেষ দুটি উপাদান একসাথে করবে (যা ইতিমধ্যে আপনার যা প্রয়োজন তা নয়)
  2. লুপের শেষে এটি শীর্ষে i=arguments.length-1এটি অ্যারের শেষ উপাদানটি যাচাই করবে এবং i+1এটি সর্বশেষটির "পরে" উপাদানটি হবে যা এটি undefined। যৌক্তিক সম্পর্কের ক্ষেত্রে, এটি বিবেচনা করা হয় false, তবে &&এই ক্ষেত্রে মানটি নিজেই উত্পাদন করে, এবং এই কারণেই ফাংশনটি undefinedসর্বদা ফিরে আসে (এই প্রশ্নটিতে এটি উল্লেখ করা যেতে পারে)।

ডক্স

expr1 && expr2: যদি expr1রূপান্তর করা যায় true, ফেরত expr2; অন্যথায়, ফিরে আসে expr1

arr=[true];
console.log("your case:",arr[0] && arr[1]);

console.log("1 && 2:", 1 && 2);


পরিবর্তে, আপনার logicalAndএকটি সংগ্রহকারী হিসাবে ব্যবহার করা উচিত , যা &&পূর্ববর্তী সমস্ত উপাদানগুলি- ফলাফলের ফলাফল সংগ্রহ করে এবং আপনি যে কৌশলটি ব্যবহার করতে পারেন তা যদি কোনও আংশিক ফলাফল &&হয় false, তবে বাকি উপাদানগুলি কী তা বিবেচনা করে না, শেষের ফলাফল হতে চলেছে false, যাতে লুপটি তত্ক্ষণাত বন্ধ হয়ে যায়:

function andMultipleExpr(){
    let logicalAnd = arguments[0] || false;
    for (let i = 1; i < arguments.length && logicalAnd; i++){
        logicalAnd = logicalAnd && arguments[i];
    }
    return logicalAnd;
}

console.log("():",andMultipleExpr());
console.log("(false):",andMultipleExpr(false));
console.log("(true):",andMultipleExpr(true));
console.log("(true,true):",andMultipleExpr(true,true));
console.log("(true, true, false, false):",andMultipleExpr(true, true, false, false));

এবং তারপরে আপনি এটি আর্চির উত্তরের দিকে অনুকূল করতে পারেন : &&আইটেমগুলির ফলাফল trueযদি সমস্ত আইটেম হয় trueএবং &&ফলাফল গণনা করার জন্য আপনাকে কোনও একক ক্রিয়াকলাপ চালাতে হয় না :

function andMultipleExpr(){
    if(arguments.length===0){
      return false;
    }
    for (let i = 0; i < arguments.length; i++){
      if(!arguments[i]){
        return false;
      }
    }
    return true;
}

console.log("():",andMultipleExpr());
console.log("(false):",andMultipleExpr(false));
console.log("(true):",andMultipleExpr(true));
console.log("(true,true):",andMultipleExpr(true,true));
console.log("(true, true, false, false):",andMultipleExpr(true, true, false, false));

(উপরের স্নিপেটগুলিতে আমি falseএকটি খালি যুক্তি তালিকার জন্য প্রস্তুত করেছিলাম ))

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