টিউপস থেকে জাভাস্ক্রিপ্ট ভেরিয়েবল অ্যাসাইনমেন্ট


105

পাইথন 2 এবং পাইথন 3 এর মতো অন্যান্য ভাষায়, আপনি একটি দ্বৈত ভেরিয়েবলের মান নির্ধারণ করতে এবং নির্ধারিত করতে পারেন এবং এর মানগুলি এই জাতীয় পুনরুদ্ধার করতে পারেন:

tuple = ("Bob", 24)
name, age = tuple
print(name)           #name evaluates to Bob
print(age)            #age evaluates to 24

জাভাস্ক্রিপ্ট মধ্যে অনুরূপ কিছু আছে? অথবা আমি কি এটির সাথে কুরুচিপূর্ণভাবেই করতে পারি:

tuple = ["Bob", 24]
name = tuple[0]       //name Evaluates to Bob
age = tuple[1]        //age Evaluates to 24

জাভাস্ক্রিপ্ট 5 এ পাইথন টিপলস অনুকরণ করার জন্য আরও ভাল উপায় আছে কি?

আপডেট: ES6 সম্পর্কিত উত্তরটি দেখুন, যা নতুন প্রকল্পের জন্য কফি স্ক্রিপ্টের পক্ষে হওয়া উচিত।


12
জাভাস্ক্রিপ্টে, ভেরিয়েবলগুলি ঘোষণা করতে ভুলবেন না:var tuple, name, age;
Vidime Vidas

4
var name=tuple[0], age=tuple[1]; এটি কিছুটা বেশি টাইপিং, তবে কুরুচিপূর্ণ হতে পারে একটি অতিমাত্রায়।
ব্রেন্ট ব্র্যাডবার্ন

উত্তর:


124

জাভাস্ক্রিপ্ট ১.7 যোগ করেছেন বিধ্বস্ত অ্যাসাইনমেন্ট যা আপনাকে পরবর্তীকালে যা করতে হবে তা মূলত করার অনুমতি দেয়।

function getTuple(){
   return ["Bob", 24];
}
var [a, b] = getTuple();
// a === "bob" , b === 24 are both true

5
এটি মান-ভিত্তিক জাভাস্ক্রিপ্ট নয়, বরং মজিলা-নির্দিষ্ট এক্সটেনশন।
নিনজাগেকো

14
@ নিনজাগেকো: "জাভাস্ক্রিপ্ট" হ'ল মজিলার বাস্তবায়ন, এবং ধ্বংসাত্মক কার্যাদি আসন্ন বাস্তু স্ক্রিপ্ট মানের অংশ হবে
বার্গি

66
এটি বাস্তবে ES6 এর অংশ।
পিয়র পাওলো রামন

10
কয়েক বছর দেওয়া আমার উত্তরটি প্রযুক্তিগতভাবে সঠিক হয়ে উঠেছে তবে সঠিক এবং সহায়ক উভয়ের পক্ষে সহায়ক নয়। হ্যাঁ!
pc1oad1etter

49

আপনি এটি কুরুচিপূর্ণভাবে করতে হবে। আপনি যদি সত্যই এরকম কিছু চান তবে আপনি কফি স্ক্রিপ্টটি পরীক্ষা করে দেখতে পারেন , এতে রয়েছে এবং এটির আরও অনেকগুলি বৈশিষ্ট্য যা এটিকে অজগরটির মতো করে তোলে (এটি বিজ্ঞাপনের মতো শোনার জন্য দুঃখিত, তবে আমি সত্যিই এটি পছন্দ করি))


হুম, এটি বেশ আকর্ষণীয়, ঠিক এই দৃশ্যে নিজেই উঠে এসেছি, কারণ জাভাস্ক্রিপ্টটি সুস্পষ্ট দ্বৈত সমর্থন সরবরাহ করে না বলে মনে হয় এবং কার্যকরী প্রোগ্রামিংয়ের তীব্র সময় থেকে আসে, আপনি টিউপসগুলির অন্বেষণ বিকাশ করেন। আমি এটি সবেমাত্র পেয়েছি, তবে নিশ্চিত নয় যে এটি কাজ করে কিনা, এটি টিউপল সমর্থনের ক্ষেত্রেও খুব ভাল দেখাচ্ছে: cs.umd.edu/projects/PL/arrowlets/api-tuples.xhtml । আমি অবশ্যই কফি স্ক্রিপ্ট তাকান।
9codeMan9

29

আপনি অনুরূপ কিছু করতে পারেন:

var tuple = Object.freeze({ name:'Bob', age:14 })

এবং তারপরে নাম এবং বয়সকে গুণাবলী হিসাবে উল্লেখ করুন

tuple.name 
tuple.age 

5
আমি ডাউনভোট করব না তবে প্রযুক্তিগতভাবে এটি ভুল। আপনি অবজেক্টটি ঘোষণার পরেও tuple.name এবং tuple.age এর মানগুলি (অর্থাত্ মুউটেট) পরিবর্তন করতে পারেন। সংজ্ঞা অনুসারে অপরিবর্তনীয় প্রকারগুলি তাদের সংজ্ঞায়িত হওয়ার পরে পরিবর্তন করা যায় না। এগুলি কেবল পঠনযোগ্য প্রকারের মতো যেখানে প্যারামিটারগুলি এবং তাদের মানগুলি কেবল একবারই ঘোষণা করা যেতে পারে।
ইভান প্লেস

4
@ ইভ্যানপ্ল্লেইস যদি মিউটেবিলিটি কোনও সমস্যা হয় তবে আপনি ব্যবহার করতে পারেন Object.freeze(), যেমন:tuple = Object.freeze({ name:'Bob', age:14 })
ক্যানন

@ ক্যানন আমি সম্মত, এটি সম্ভবত এই পুরো থ্রেডের একমাত্র গ্রহণযোগ্য / সঠিক পদ্ধতি। দুর্ভাগ্যক্রমে, এমসিসির উত্তরটি বস্তুটি হিমশিমতি করে না তাই এটি এখনও পরিবর্তনযোগ্য।
ইভান প্লেইস

@ ইভানপ্লাইস আমি দেখতে পাচ্ছি না যে পরিবর্তনের বিষয়টি কোথা থেকে এসেছে - টিপলস মূল পাইথনের উদাহরণে অপরিবর্তনীয় নয়!
ড্যানিয়েল বাকমাস্টার

@ ড্যানিয়েলবাকমাস্টার পাইথনের তালিকার এবং তালিকার মধ্যে পার্থক্য হ'ল একটি তালিকা পারস্পরিক পরিবর্তনযোগ্য, যদিও একটি টুপল নয়। ডকস.পাইথন.আর . / ২ / টিউটোরিয়াল/ … দেখুন । টিউপসগুলি জাভাস্ক্রিপ্টে স্থানীয়ভাবে সমর্থিত নয় কারণ আপনি তৈরির পরে অবজেক্টে অবজেক্ট.ফ্রিজে () না কল করলে সমস্ত জেএস ডেটা স্ট্রাকচার পরিবর্তন করতে পারে।
ইভান প্লেইস

27

এই "টিপল" বৈশিষ্ট্যটিকে এ্যাকমাস্ক্রিপ্ট ২০১৫-এ ডেস্ট্রাকচারিং বলা হয় এবং শীঘ্রই আপ টু ডেট ব্রাউজারগুলি সমর্থন করবে। আপাতত, কেবল ফায়ারফক্স এবং ক্রোমই এটি সমর্থন করে

তবে ওহে, আপনি ট্রান্সপেলার ব্যবহার করতে পারেন ।

কোডটি অজগরটির মতো দুর্দান্ত দেখাচ্ছে:

let tuple = ["Bob", 24]
let [name, age] = tuple

console.log(name)
console.log(age)

4
ভবিষ্যতের পাঠকদের জন্য: ক্রোম 49 (মোজিলা ডক্স অনুসারে) এই বৈশিষ্ট্যটি ক্রোমে সমর্থিত। আপনি এখানে মজিলা ডক্স ব্যবহার করে সামঞ্জস্যতা পরীক্ষা করতে পারেন: বিকাশকারী.মোজিলা.আর.ইন-
জ্যামি

14

হিমায়িত অ্যারে অজগর টিপলের সাথে একই রকম আচরণ করে:

const tuple = Object.freeze(["Bob", 24]);
let [name, age]; = tuple
console.debug(name); // "Bob"
console.debug(age); // 24

অভিনব হোন এবং একটি ক্লাস সংজ্ঞায়িত করুন

class Tuple extends Array { 
  constructor(...items) { 
    super(...items); 
    Object.freeze(this);
  } 
}

let tuple = new Tuple("Jim", 35);
let [name, age] = tuple;
console.debug(name); // Jim
console.debug(age); // 35
tuple = ["Bob", 24]; // no effect 
console.debug(name); // Jim
console.debug(age); // 25

সমস্ত সর্বশেষতম ব্রাউজারে আজ কাজ করে।


আপনি কি কেবল কোনও কনস্টে সেট করতে পারেননি? কনস্ট অপরিবর্তনীয়, না?
চিহ্নিত করুন

4
না। কনস্ট পুনরায় নিয়োগযোগ্য নয়। আপনি কনট টিউপল করতে পারবেন না = ["জিম", 35]; tuple = ["জেমস", 35]। আপনি কনট টিপল করতে পারেন = ["জিম", 35]; tuple [0] = "জেমস"; সুতরাং এটি পরিবর্তনযোগ্য নয়।
ম্যাথু জেমস ডেভিস

6

টিপলগুলি জাভাস্ক্রিপ্টে সমর্থিত নয়

আপনি যদি কোনও পরিবর্তনযোগ্য তালিকার সন্ধান করছেন তবে অবজেক্ট.ফ্রিজে () একটি অ্যারেকে অপরিবর্তনীয় করে তোলার জন্য ব্যবহার করা যেতে পারে।

অবজেক্ট.ফ্রিজে () পদ্ধতিটি কোনও বস্তুকে হিমশীতল করে তোলে: এটি নতুন বৈশিষ্ট্যগুলিকে এতে যুক্ত হতে বাধা দেয়; বিদ্যমান সম্পত্তিগুলি অপসারণ থেকে বাধা দেয়; এবং বিদ্যমান বৈশিষ্ট্য, বা তাদের পরিমিতি, কনফিগারেশন বা লিখনযোগ্যতা পরিবর্তন হতে বাধা দেয়। সংক্ষেপে অবজেক্টটি কার্যকরভাবে অপরিবর্তনীয় হয়। পদ্ধতিটি বস্তুকে হিমায়িত করে ফিরে আসে।

উত্স: মজিলা বিকাশকারী নেটওয়ার্ক - অবজেক্ট.ফ্রিজে ()

যথারীতি একটি অ্যারের বরাদ্দ করুন তবে 'অবজেক্ট.ফ্রিজে () ব্যবহার করে এটি লক করুন

> tuple = Object.freeze(['Bob', 24]);
[ 'Bob', 24 ]

আপনি নিয়মিত অ্যারে হিসাবে মানগুলি ব্যবহার করুন (পাইথন মাল্টি-এসাইনমেন্ট সমর্থিত নয়)

> name = tuple[0]
'Bob'
> age = tuple[1]
24

একটি নতুন মান নির্ধারণের চেষ্টা করুন

> tuple[0] = 'Steve'
'Steve'

কিন্তু মান পরিবর্তন করা হয় না

> console.log(tuple)
[ 'Bob', 24 ]

সাইড-নোটে আশা করা যায় যে টিপলস ইএস 6 এ প্রথম শ্রেণির সমর্থন পাবে। সত্যিকারের নেটিভ টিপল (অর্থাত্ ভিন্ন ভিন্ন ক্রম) গতিও উন্নত করবে।
ইভান প্লেস

5

দুর্ভাগ্যক্রমে আপনি (ECMA | জাভা) স্ক্রিপ্টে এই দ্বিগুণ নিয়োগের বাক্য গঠন ব্যবহার করতে পারবেন না।

সম্পাদনা: মোজিলা / জেএস 1.7 এর সাথে যুক্ত কেউ - এটি ক্রস ব্রাউজারে কাজ করবে না তবে যদি এটির প্রয়োজন না হয় তবে আপনার উত্তর আছে।


3

এটি বাস্তবে বাস্তব জীবনে ব্যবহার করার উদ্দেশ্যে নয়, কেবল একটি আকর্ষণীয় অনুশীলন। দেখুন কেন জাভাস্ক্রিপ্টের ইভাল ফাংশনটি ব্যবহার করা খারাপ ধারণা? বিস্তারিত জানার জন্য.

এটি বিক্রেতার-নির্দিষ্ট এক্সটেনশানগুলির অবলম্বন না করেই আপনি পেতে পারেন:

myArray = [1,2,3];
eval(set('a,b,c = myArray'));

সহায়ক ফাংশন:

function set(code) {
    var vars=code.split('=')[0].trim().split(',');
    var array=code.split('=')[1].trim();
    return 'var '+vars.map(function(x,i){return x+'='+array+'['+i+']'}).join(',');
}

প্রমাণ যে এটি নির্বিচারে সুযোগে কাজ করে:

(function(){
    myArray = [4,5,6];
    eval(set('x,y,z = myArray'));
    console.log(y);  // prints 5
})()

eval সাফারি সমর্থিত নয়।


5
সুপার চালাক হওয়ার জন্য +1, বাস্তব জীবনে এটি কখনও ব্যবহার করবেন না যদিও :
পি

3

মন্ত্রীর উত্তরের আপডেট হিসাবে আপনি এখন es2015 দিয়ে এটি করতে পারেন:

function Tuple(...args) {
  args.forEach((val, idx) => 
    Object.defineProperty(this, "item"+idx, { get: () => val })
  )
}


var t = new Tuple("a", 123)
console.log(t.item0) // "a"
t.item0 = "b"
console.log(t.item0) // "a"

https://jsbin.com/fubaluwimo/edit?js,console


কোন কারণে আপনি ES2015 আগে এই যেত না হচ্ছে ... এছাড়াও এই ওপি এর প্রশ্নের উত্তর না পান তবে তিনি ডেসট্রাকচারিং চাইলেন
assembly_wizard

3

আপনি জাভাস্ক্রিপ্টে একটি দ্বৈত টাইপ থাকতে পারে। উচ্চতর অর্ডার ফাংশন দিয়ে কেবল এটি সংজ্ঞায়িত করুন (শিক্ষাগত শব্দটি চার্চ এনকোডিং):

const Tuple = (...args) => {
  const Tuple = f => f(...args);
  return Object.freeze(Object.assign(Tuple, args));
};

const get1 = tx => tx((x, y) => x);

const get2 = tx => tx((x, y) => y);

const bimap = f => g => tx => tx((x, y) => Tuple(f(x), g(y)));

const toArray = tx => tx((...args) => args);

// aux functions

const inc = x => x + 1;
const toUpperCase = x => x.toUpperCase();

// mock data

const pair = Tuple(1, "a");

// application

console.assert(get1(pair) === 1);
console.assert(get2(pair) === "a");

const {0:x, 1:y} = pair;
console.log(x, y); // 1 a

console.log(toArray(bimap(inc) (toUpperCase) (pair))); // [2, "A"]

const map = new Map([Tuple(1, "a"), Tuple(2, "b")]);
console.log(map.get(1), map.get(2)); // a b

দয়া করে নোট করুন যে Tupleকোনও সাধারণ নির্মাতা হিসাবে ব্যবহৃত হয় না। সমাধানটি প্রোটোটাইপ সিস্টেমে মোটেই নির্ভর করে না, তবে কেবলমাত্র উচ্চতর ক্রমের জন্য।

টিপলসের Arrayমতো টিপলসের ব্যবহারগুলি কী কী ? চার্চের এনকোডযুক্ত টিপলগুলি ডিজাইনের দ্বারা অপরিবর্তনীয় এবং এইভাবে মিউটেশনের ফলে হওয়া পার্শ্ব প্রতিক্রিয়া প্রতিরোধ করে। এটি আরও শক্তিশালী অ্যাপ্লিকেশনগুলি তৈরি করতে সহায়তা করে। উপরন্তু, এটা যে মধ্যে পার্থক্য কোড সম্পর্কে কারণ সহজ Arrayএকটি সংগ্রহ টাইপ (যেমন হিসাবে গুলি [a]) এবং বিভিন্ন প্রকারের সম্পর্কিত ডেটা যেমন tuples (যেমন (a, b))।


1

এখানে একটি সাধারণ জাভাস্ক্রিপ্ট টুপল বাস্তবায়ন:

var Tuple = (function () {
   function Tuple(Item1, Item2) {
      var item1 = Item1;
      var item2 = Item2;
      Object.defineProperty(this, "Item1", {
          get: function() { return item1  }
      });
      Object.defineProperty(this, "Item2", {
          get: function() { return item2  }
      });
   }
   return Tuple;
})();

var tuple = new Tuple("Bob", 25); // Instantiation of a new Tuple
var name = tuple.Item1; // Assignment. name will be "Bob"
tuple.Item1 = "Kirk"; // Will not set it. It's immutable.

এটি একটি 2-টিপল, তবে, আপনি 3,4,5,6 ইত্যাদি টিপলস সমর্থন করতে আমার উদাহরণটি পরিবর্তন করতে পারেন।


আসলে এটি কোনও টি-আপল নয়, একটি জুটি।
পিয়র পাওলো র্যামন

tupleউদাহরণ হিসেবে বলা যায় এখনো চপল, তাই এটি টেকনিক্যালি একটি tuple নয়। প্রমাণ পরিবর্তনের জন্য tuple.Item1 = "Steve"তারপর console.log()আউটপুট।
ইভান প্লেইস

4
এটি সন্ধানের জন্য ধন্যবাদ। টিপলকে অস্থাবর করার জন্য আমি উদাহরণটি সংশোধন করেছি।
ফারিস জ্যাকিনা

একটি স্বেচ্ছাসেবী দৈর্ঘ্য সমর্থন করতে আপনি এটি কীভাবে সংশোধন করবেন?
এআইজি

এই ওপি এর প্রশ্নের উত্তর না পান তবে তিনি ডেসট্রাকচারিং চাইলেন
assembly_wizard

-1

পাইথন টিপল পদ্ধতির সাথে ম্যাথু জেমস ডেভিসের উত্তরের একটি সংস্করণ এখানে যুক্ত করা হয়েছে:

class Tuple extends Array { 
  constructor(...items) { 
    super(...items); 
    Object.freeze(this);
  }
  toArray() {
    return [...this];
  }
  toString() {
    return '('+super.toString()+')';
  }
  count(item) {
    var arr = this.toArray();
    var result = 0;
    for(var i = 0; i < arr.length; i++) {
       if(arr[i] === item) {
         result++;
       }
    }
    return result;
  }

  

  
}

   let tuple = new Tuple("Jim", 35);
   let [name,age] = tuple;

console.log("tuple:"+tuple)
console.log("name:"+name)
console.log("age:"+age)


-1

আমি একটি টুপল বাস্তবায়ন করেছি যা বেশ ভালভাবে কাজ করে। এই দ্রষ্টব্যটি অ্যারে ডেস্ট্রাকচারিংয়ের পাশাপাশি বেসিক টাইপ-চেকিংয়ের অনুমতি দেয়।

const Tuple = (function() {
    function Tuple() {
        // Tuple needs at least one element
        if (arguments.length < 1) {
            throw new Error('Tuple needs at least one element');
        }

        const args = { ...arguments };

        // Define a length property (equal to the number of arguments provided)
        Object.defineProperty(this, 'length', {
            value: arguments.length,
            writable: false
        });

        // Assign values to enumerable properties
        for (let i in args) {
            Object.defineProperty(this, i, {
                enumerable: true,
                get() {
                    return args[+i];
                },
                // Checking if the type of the provided value matches that of the existing value
                set(value) {
                    if (typeof value !== typeof args[+i]) {
                        throw new Error('Cannot assign ' + typeof value + ' on ' + typeof args[+i]);
                    }

                    args[+i] = value;
                }
            });
        }

        // Implementing iteration with Symbol.iterator (allows for array destructuring as well for...of loops)
        this[Symbol.iterator] = function() {
            const tuple = this;

            return {
                current: 0,
                last: tuple.length - 1,
                next() {
                    if (this.current <= this.last) {
                        let val = { done: false, value: tuple[this.current] };
                        this.current++;
                        return val;
                    } else {
                        return { done: true };
                    }
                }
            };
        };

        // Sealing the object to make sure no more values can be added to tuple
        Object.seal(this);
    }

    // check if provided object is a tuple
    Tuple.isTuple = function(obj) {
        return obj instanceof Tuple;
    };

    // Misc. for making the tuple more readable when printing to the console
    Tuple.prototype.toString = function() {
        const copyThis = { ...this };
        const values = Object.values(copyThis);
        return `(${values.join(', ')})`;
    };

    // conctat two instances of Tuple
    Tuple.concat = function(obj1, obj2) {
        if (!Tuple.isTuple(obj1) || !Tuple.isTuple(obj2)) {
            throw new Error('Cannot concat Tuple with ' + typeof (obj1 || obj2));
        }

        const obj1Copy = { ...obj1 };
        const obj2Copy = { ...obj2 };

        const obj1Items = Object.values(obj1Copy);
        const obj2Items = Object.values(obj2Copy);

        return new Tuple(...obj1Items, ...obj2Items);
    };

    return Tuple;
})();

const SNAKE_COLOR = new Tuple(0, 220, 10);

const [red, green, blue] = SNAKE_COLOR;
console.log(green); // => 220


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