জাভাস্ক্রিপ্ট অবজেক্টে গতিশীল নামযুক্ত বৈশিষ্ট্য যুক্ত করা কি সম্ভব?


745

জাভাস্ক্রিপ্টে, আমি এর মতো একটি বিষয় তৈরি করেছি:

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};

প্রারম্ভিক সৃষ্টির পরে এই বিষয়টিতে আরও বৈশিষ্ট্য যুক্ত করা সম্ভব হয় যদি রান সময় পর্যন্ত বৈশিষ্ট্যের নাম নির্ধারণ না করা হয়? অর্থাত

var propName = 'Property' + someUserInput
//imagine someUserInput was 'Z', how can I now add a 'PropertyZ' property to 
//my object?

উত্তর:


1209

হ্যাঁ.

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};

data["PropertyD"] = 4;

// dialog box with 4 in it
alert(data.PropertyD);
alert(data["PropertyD"]);


142
@ থেডজ: ডেটা.প্রপার্টিডি সম্পত্তি সম্পর্কিত নাম জানা দরকার যা যথেষ্ট গতিশীল নয়।
জর্জি স্কলি

6
+1 কারণ এটি আমাকে সহায়তা করেছিল। তবে আমি বুঝতে পারি না কেন কোনও বস্তুর বৈশিষ্ট্যগুলি অ্যারের মতো পরিচালনা করা হয়।
রন ভ্যান ডের হাইজডেন

9
@ বোন্ডে: এটি জাভাস্ক্রিপ্টের অদ্ভুত ডিজাইনের অংশ। এই ক্ষেত্রে object["property"]না ঠিক হিসাবে একই array[4], সাবেক একজন সত্যিকারের অ্যারে হিসাবে নির্মিত হয় নি।
জর্জি স্কলি

5
এটি কি কেবল আমি বা এই পোস্টটি 195 টি পদক্ষেপ গ্রহণের সময় প্রশ্নের উত্তর দেয় না? আমি ভেবেছিলাম যে এটি জাভাস্ক্রিপ্ট কোডে উত্পন্ন না হওয়া পর্যন্ত নামগুলি অজানা যেখানে বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে জিজ্ঞাসা করছে।
কান্টাস 94 ভারী

20
@ কান্টাস: আসুন বলি এটি সরাসরি উত্তর দেয় না। কিন্তু থেকে data["PropertyD"]যেতে data[function_to_get_property_name()]তুচ্ছ মনে হয়।
জর্জি স্কলি

154

জয়ের জন্য ES6!

const b = 'b';
const c = 'c';

const data = {
    a: true,
    [b]: true, // dynamic property
    [`interpolated-${c}`]: true, // dynamic property + interpolation
    [`${b}-${c}`]: true
}

আপনি লগ dataযদি আপনি এটি পেতে:

{
  a: true,
  b: true,
  interpolated-c: true,
  b-c: true
}

এটি নতুন গণিত সম্পত্তি বাক্য গঠন এবং টেম্পলেট লিটারালগুলি ব্যবহার করে


1
আমার কোডটি সম্পূর্ণ কার্যকরী হোক এমন ক্ষেত্রে আমার এটির প্রয়োজন ছিল (যেমন কোনও অত্যাবশ্যক বিবৃতি বলা হয় না obj[propname])। পরিবর্তে, আমি অবজেক্ট স্প্রেড সিনট্যাক্স সহ এটি ব্যবহার করতে সক্ষম হয়েছি।
ইন্ট্রিক্রটর

2
এই কোড স্নিপেটটি এমন কোনও ব্যক্তির সাথে কী করছে যা অবিলম্বে সুস্পষ্ট নয় যারা নতুন সিনট্যাক্সটি দেখেনি বা বোঝা যায়নি। আমি 'এ' কনস্টের সাথে আউটপুট / প্রত্যাশিত যথাযথ প্রদর্শন করার জন্য একটি সম্পাদনার পরামর্শ দেব।

ব্যক্তিগতভাবে, আমি মনে করি ES5 উপায়টি অনেক পরিষ্কার এবং বুঝতে সহজ:var a = {}; a["dynamic-" + prop] = true;
জ্যাক গিফিন

1
@ জ্যাকগিফিন কিছু ক্ষেত্রে হ্যাঁ, তবে অপরিবর্তনীয় কাঠামোর সাথে কাজ করার সময়, এই সিনট্যাক্সটি খুব কার্যকরী হতে পারে, যেহেতু আপনি যে পদ্ধতিটি দেখিয়েছেন তা পরিবর্তনীয় a। (বিশেষত রডুএক্সের মতো প্যাকেজগুলি ব্যবহার করার সময়)
মরিসিও

3
এটি কেবল দুর্দান্ত state ... রাষ্ট্র, [প্রস্তাব]: ভাল}
শিপো

87

হ্যা এটা সম্ভব. ধরে নেওয়া যাক:

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};
var propertyName = "someProperty";
var propertyValue = "someValue";

উভয় ক্ষেত্রেই:

data[propertyName] = propertyValue;

অথবা

eval("data." + propertyName + " = '" + propertyValue + "'");

প্রথম পদ্ধতি পছন্দ করা হয়। eval () এর স্পষ্ট সুরক্ষা উদ্বেগ রয়েছে যদি আপনি ব্যবহারকারীর সরবরাহিত মানগুলি ব্যবহার করেন তবে এটি এড়াতে পারলে এটি ব্যবহার করবেন না তবে এটি বিদ্যমান এবং এটি কী করতে পারে তা জেনে রাখা উচিত।

আপনি এটি দিয়ে উল্লেখ করতে পারেন:

alert(data.someProperty);

অথবা

data(data["someProperty"]);

অথবা

alert(data[propertyName]);

40
ইভাল ব্যবহার করা সত্যিই বিপজ্জনক।
জর্জি শুলি

10
ধীর উল্লেখ না।
ইমন নের্বোন

@ জর্জিস্কুলি সত্য
ওবিনা নওয়াকউউ

1
দ্রষ্টব্য (যদি কেউ আমার মতো একই সমস্যাটি চালায় তবে): সাধারণ জিনিসের জন্য এটি ঠিক কাজ করে। তবে আইটেমের তালিকাকে ধরে রাখতে আমাকে jQuery UI অবজেক্টে কিছু সম্পত্তি যুক্ত করতে হয়েছিল। সেক্ষেত্রে এইভাবে যুক্ত করা থাকলে সম্পত্তিটি হারিয়ে গিয়েছিল কারণ jQuery সর্বদা একটি অনুলিপি তৈরি করে। এখানে আপনার jQuery.extend () ব্যবহার করতে হবে ।
ম্যাট

আমি আমার আগের মন্তব্যে যুক্ত করতে চাই - এমনকি এটি আমার ক্ষেত্রে কার্যকর হয়নি। তাই আমি $("#mySelector").data("propertyname", myvalue);সেটটি ব্যবহার করে এবং var myValue=$("#mySelector").data("propertyname");মানটি ফিরে পেতে শেষ করেছি । এমনকি জটিল অবজেক্টস (তালিকাগুলি, অ্যারে ...) এভাবে যুক্ত করা যায়।
ম্যাট

61

আমি জানি যে প্রশ্নের সঠিক উত্তর দেওয়া হয়েছে, তবে আমি নতুন বৈশিষ্ট্য যুক্ত করার জন্য আরও একটি উপায় খুঁজে পেয়েছি এবং এটি আপনার সাথে ভাগ করতে চেয়েছিলাম:

আপনি ফাংশন ব্যবহার করতে পারেন Object.defineProperty()

মজিলা বিকাশকারী নেটওয়ার্কে পাওয়া গেছে

উদাহরণ:

var o = {}; // Creates a new object

// Example of an object property added with defineProperty with a data property descriptor
Object.defineProperty(o, "a", {value : 37,
                               writable : true,
                               enumerable : true,
                               configurable : true});
// 'a' property exists in the o object and its value is 37

// Example of an object property added with defineProperty with an accessor property descriptor
var bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
                               set : function(newValue){ bValue = newValue; },
                               enumerable : true,
                               configurable : true});
o.b = 38;
// 'b' property exists in the o object and its value is 38
// The value of o.b is now always identical to bValue, unless o.b is redefined

// You cannot try to mix both :
Object.defineProperty(o, "conflict", { value: 0x9f91102, 
                                       get: function() { return 0xdeadbeef; } });
// throws a TypeError: value appears only in data descriptors, get appears only in accessor descriptors

4
এই পদ্ধতির পেশাদার এবং কনস?
ট্রেভর

6
@ ট্র্যাভোর: মোট কনফিগার করার ক্ষমতা এবং গিটার এবং সেটটার যুক্ত করার ক্ষমতা; এছাড়াও, একাধিক বৈশিষ্ট্য যুক্ত করার ক্ষমতা defineProperties(বহুবচন) দিয়ে add
rvighne

থিলিশিয়াস Object.definePropertyসহজ সুবিধাজনক সরঞ্জাম হিসাবে বোঝানো হচ্ছে না, তবে সূক্ষ্ম নিয়ন্ত্রণযুক্ত একটি। আপনার যদি অতিরিক্ত অতিরিক্ত নিয়ন্ত্রণের প্রয়োজন না হয় তবে এটি চয়ন করার সঠিক সরঞ্জাম নয়।
kleinfreund

Object.defineProperty(obj, prop, valueDescriptor)ভি 8 সহজতর করার চেয়ে অনুকূলকরণ করা অনেক ধীর এবং শক্ত obj[prop] = value;
জ্যাক গিফিন

27

ES6 গণিত সম্পত্তি নাম পরিচয় করিয়ে দেয়, যা আপনাকে এটি করতে দেয় allow

let a = 'key'
let myObj = {[a]: 10};
// output will be {key:10}

23

এখানে, আপনার স্বরলিপি ব্যবহার করে:

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};
var propName = 'Property' + someUserInput
//imagine someUserInput was 'Z', how can I now add a 'PropertyZ' property to 
//my object?
data[propName] = 'Some New Property value'

18

ডট স্বরলিপি ব্যবহার করে আপনি নিজের পছন্দমতো আরও বেশি সংখ্যক বৈশিষ্ট্য যুক্ত করতে পারেন:

var data = {
    var1:'somevalue'
}
data.newAttribute = 'newvalue'

বা :

data[newattribute] = somevalue

গতিশীল কীগুলির জন্য।


4
রান সময় পর্যন্ত যদি সম্পত্তিটির নাম নির্ধারিত না হয় "- সুতরাং আপনি যদি ইওল ব্যবহার না করেন তবে এটি কাজ করবে না, যা ভাল বিকল্প নয়
মার্ক গ্র্যাভেল

1
অথবা [] সিনট্যাক্স ... ডেটা [সামোয়ার] ব্যবহার করুন = কিছুটা
গ্যাব্রিয়েল হারলি

17

পূর্ববর্তী সমস্ত উত্তরগুলি ছাড়াও, এবং আপনি যদি ভাবছেন যে আমরা ভবিষ্যতে গণিত সম্পত্তি নামগুলি (ECMAScript 6) ব্যবহার করে কীভাবে গতিশীল সম্পত্তির নাম লিখব , এখানে কীভাবে:

var person = "John Doe";
var personId = "person_" + new Date().getTime();
var personIndex = {
    [ personId ]: person
//  ^ computed property name
};

personIndex[ personId ]; // "John Doe"

তথ্যসূত্র: ECMAScript 6 বোঝা - নিকোলাস জাকাস


11

উপরের উত্তরটির অ্যাবিংয়ের জন্য কেবল একটি সংযোজন। আপনি নীচে উল্লিখিত হিসাবে DefineProperty জটিলতা encapsulate একটি ফাংশন সংজ্ঞায়িত করতে পারেন।

var defineProp = function ( obj, key, value ){
  var config = {
    value: value,
    writable: true,
    enumerable: true,
    configurable: true
  };
  Object.defineProperty( obj, key, config );
};

//Call the method to add properties to any object
defineProp( data, "PropertyA",  1 );
defineProp( data, "PropertyB",  2 );
defineProp( data, "PropertyC",  3 );

তথ্যসূত্র: http://addyosmani.com


9

আপনি নীচের কয়েকটি বিকল্প ব্যবহার করে গতিশীলভাবে বৈশিষ্ট্যগুলি যুক্ত করতে পারেন:

আপনার উদাহরণে:

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};

আপনি পরবর্তী দুটি উপায়ে একটি গতিশীল মান সহ একটি সম্পত্তি নির্ধারণ করতে পারেন:

data.key = value;

অথবা

data['key'] = value;

আরও বেশি .. যদি আপনার কীটিও গতিশীল হয় তবে আপনি এটির সাথে অবজেক্ট শ্রেণিটি ব্যবহার করে সংজ্ঞায়িত করতে পারেন:

Object.defineProperty(data, key, withValue(value));

যেখানে ডেটা আপনার অবজেক্ট, মূল নামটি সংরক্ষণ করার জন্য কীটি হল ভেরিয়েবল এবং মানটি সংরক্ষণ করার জন্য ভেরিয়েবল।

আশা করি এটা কাজে লাগবে!


8

আমি জানি এই পোস্টটির ইতিমধ্যে বেশ কয়েকটি উত্তর রয়েছে তবে আমি একাধিক বৈশিষ্ট্য আছে এবং সেগুলি অ্যারের মধ্যে রয়েছে এমন একটিও দেখিনি। এবং উপায় এই সমাধানটি ES6 এর জন্য।

উদাহরণস্বরূপ, ধরা যাক যে আমাদের ভিতরে একটি অ্যারে নামের ব্যক্তি রয়েছে যার ভিতরে বস্তু রয়েছে:

 let Person = [{id:1, Name: "John"}, {id:2, Name: "Susan"}, {id:3, Name: "Jet"}]

সুতরাং, আপনি সংশ্লিষ্ট মান সহ একটি সম্পত্তি যুক্ত করতে পারেন। ধরা যাক আমরা EN এর একটি ডিফল্ট মান সহ একটি ভাষা যুক্ত করতে চাই ।

Person.map((obj)=>({...obj,['Language']:"EN"}))

ব্যক্তি অ্যারে এখন এই মতো হবে:

Person = [{id:1, Name: "John", Language:"EN"}, 
{id:2, Name: "Susan", Language:"EN"}, {id:3, Name: "Jet", Language:"EN"}]

আপনি আসলে কোনও বস্তুতে বৈশিষ্ট্য যুক্ত করছেন না, আপনি পুরানো বস্তুর বৈশিষ্ট্যগুলি (স্প্রেড অপারেটরের মাধ্যমে) এবং নতুন প্রপসগুলিও তৈরি করছেন।
এড ওরসি

3
আপনি ঠিক ছিলেন যে এটি করা উচিত ছিল Person = Person.map(code here)। তবে মুল বক্তব্যটি হ'ল আপনি সহজে কোনও বিদ্যমান বস্তুর সাথে সম্পত্তি যুক্ত করতে পারেন ES6
এড্পার

5

সবচেয়ে সহজ এবং বহনযোগ্য উপায় হ'ল।

var varFieldName = "good";
var ob = {};
Object.defineProperty(ob, varFieldName , { value: "Fresh Value" });

উত্তর উপর ভিত্তি করে উত্তর!


3

(ডট) পদ্ধতিটি ব্যবহার করে বিদ্যমান অবজেক্টটিতে কোনও সম্পত্তি যুক্ত করার সময় সাবধান হন ।

(.dot) অবজেক্টে কোনও বিশিষ্টতা যোগ করার পদ্ধতি শুধুমাত্র আপনি ব্যবহার করা উচিত জানি 'কী' পূর্বেই অন্যথায় ব্যবহার [বন্ধনী] পদ্ধতি।

উদাহরণ:

   var data = {
        'Property1': 1
    };
    
    // Two methods of adding a new property [ key (Property4), value (4) ] to the
    // existing object (data)
    data['Property2'] = 2; // bracket method
    data.Property3 = 3;    // dot method
    console.log(data);     // { Property1: 1, Property2: 2, Property3: 3 }
    
    // But if 'key' of a property is unknown and will be found / calculated
    // dynamically then use only [bracket] method not a dot method    
    var key;
    for(var i = 4; i < 6; ++i) {
    	key = 'Property' + i;     // Key - dynamically calculated
    	data[key] = i; // CORRECT !!!!
    }
    console.log(data); 
    // { Property1: 1, Property2: 2, Property3: 3, Property4: 4, Property5: 5 }
    
    for(var i = 6; i < 2000; ++i) {
    	key = 'Property' + i; // Key - dynamically calculated
    	data.key = i;         // WRONG !!!!!
    }
    console.log(data); 
    // { Property1: 1, Property2: 2, Property3: 3, 
    //   Property4: 4, Property5: 5, key: 1999 }

কনসোল লগের শেষে সমস্যাটি নোট করুন - সম্পত্তি 6: 6, সম্পত্তি 7: 7, ........., সম্পত্তি 1999: 1999 এর পরিবর্তে 'কী: 1999' । সুতরাং গতিশীলভাবে তৈরি সম্পত্তি যুক্ত করার সর্বোত্তম উপায় হ'ল [বন্ধনী] পদ্ধতি।


1

গতিশীল স্ট্রিং নাম থেকে অ্যাক্সেসের একটি দুর্দান্ত উপায় যাতে অবজেক্ট থাকে (উদাহরণস্বরূপ অবজেক্ট.সুবজেক্ট.প্রোপার্টি)

function ReadValue(varname)
{
    var v=varname.split(".");
    var o=window;
    if(!v.length)
        return undefined;
    for(var i=0;i<v.length-1;i++)
        o=o[v[i]];
    return o[v[v.length-1]];
}

function AssignValue(varname,value)
{
    var v=varname.split(".");
    var o=window;
    if(!v.length)
        return;
    for(var i=0;i<v.length-1;i++)
        o=o[v[i]];
    o[v[v.length-1]]=value;
}

উদাহরণ:

ReadValue("object.subobject.property");
WriteValue("object.subobject.property",5);

eval পড়া মানের জন্য কাজ করে, তবে লেখার মানটি কিছুটা শক্ত।

আরও উন্নত সংস্করণ (সাবক্লাসগুলি তৈরি করুন যদি সেগুলি উপস্থিত না থাকে এবং বৈশ্বিক ভেরিয়েবলের পরিবর্তে বস্তুর অনুমতি দেয়)

function ReadValue(varname,o=window)
{
    if(typeof(varname)==="undefined" || typeof(o)==="undefined" || o===null)
        return undefined;
    var v=varname.split(".");
    if(!v.length)
        return undefined;
    for(var i=0;i<v.length-1;i++)
    {
        if(o[v[i]]===null || typeof(o[v[i]])==="undefined") 
            o[v[i]]={};
        o=o[v[i]];
    }
    if(typeof(o[v[v.length-1]])==="undefined")    
        return undefined;
    else    
        return o[v[v.length-1]];
}

function AssignValue(varname,value,o=window)
{
    if(typeof(varname)==="undefined" || typeof(o)==="undefined" || o===null)
        return;
    var v=varname.split(".");
    if(!v.length)
        return;
    for(var i=0;i<v.length-1;i++)
    {
        if(o[v[i]]===null || typeof(o[v[i]])==="undefined")
            o[v[i]]={};
        o=o[v[i]];
    }
    o[v[v.length-1]]=value;
}

উদাহরণ:

ReadValue("object.subobject.property",o);
WriteValue("object.subobject.property",5,o);

এটি একই। O.object.subobject.property


1
ঠিক আমি যা খুঁজছিলাম, এটি রিস্যাক্ট করার জন্য এটি কার্যকর set সেট স্টেট ({গতিশীল সম্পত্তি: মান}) থ্যানকিউ!
কেভিন ড্যানিকোভস্কি

0

আমি কীভাবে সমস্যার সমাধান করেছি তা এখানে।

var obj = {

};
var field = "someouter.someinner.someValue";
var value = 123;

function _addField( obj, field, value )
{
    // split the field into tokens
    var tokens = field.split( '.' );

    // if there's more than one token, this field is an object
    if( tokens.length > 1 )
    {
        var subObj = tokens[0];

        // define the object
        if( obj[ subObj ] !== undefined ) obj[ subObj ] = {};

        // call addfield again on the embedded object
        var firstDot = field.indexOf( '.' );
        _addField( obj[ subObj ], field.substr( firstDot + 1 ), value );

    }
    else
    {
        // no embedded objects, just field assignment
        obj[ field ] = value;
    }
}

_addField( obj, field, value );
_addField(obj, 'simpleString', 'string');

console.log( JSON.stringify( obj, null, 2 ) );

নিম্নলিখিত বস্তু উত্পন্ন:

{
  "someouter": {
    "someinner": {
      "someValue": 123
    }
  },
  "simpleString": "string"
}

0

মিশ্রিত নতুন সম্পত্তি রানটাইমে যুক্ত হলে এটি কার্যকর হতে পারে:

data = { ...data, newPropery: value}

যাইহোক, স্প্রেড অপারেটর অগভীর অনুলিপি ব্যবহার করে তবে এখানে আমরা নিজেরাই ডেটা বরাদ্দ করি যাতে কিছুই হারাতে না পারে


-2

একটি নিখুঁত সহজ উপায়

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};

var newProperty = 'getThisFromUser';
data[newProperty] = 4;

console.log(data);

আপনি যদি এটির ডেটার অ্যারে প্রয়োগ করতে চান (ES6 / TS সংস্করণ)

const data = [
  { 'PropertyA': 1, 'PropertyB': 2, 'PropertyC': 3 },
  { 'PropertyA': 11, 'PropertyB': 22, 'PropertyC': 33 }
];

const newProperty = 'getThisFromUser';
data.map( (d) => d[newProperty] = 4 );

console.log(data);

-14

স্পষ্টভাবে. এটিকে অভিধান বা সহযোগী অ্যারে হিসাবে ভাবেন। আপনি যে কোনও সময়ে এটি যুক্ত করতে পারেন।


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