জাভাস্ক্রিপ্টে মাল্টি-ডাইমেনশনাল অ্যা্যাসোসিয়েটিভ অ্যারে


85

নিম্নলিখিত কোয়েরির ফলাফল রয়েছে: (কী 1 এবং কী 2 কোনও পাঠ্য হতে পারে)

id   key1     key2     value

1    fred     apple    2
2    mary     orange   10
3    fred     banana   7
4    fred     orange   4
5    sarah    melon    5
...

এবং আমি গ্রিডে ডেটা সংরক্ষণ করতে চাই (সম্ভবত কোনও অ্যারে হিসাবে) সমস্ত রেকর্ডটি এ জাতীয়ভাবে লুপ করে :

         apple    orange   banana  melon
fred        2        4         7     -
mary        -        10        -     -
sarah       -        -         -     5

পিএইচপি-তে এটি সহযোগী অ্যারেগুলি ব্যবহার করে সত্যই সহজ হবে:

$result['fred']['apple'] = 2;

তবে জাভাস্ক্রিপ্টে এসোসিয়েটিভ অ্যারেগুলি এর মতো কাজ করে না। প্রচুর টিউটোরিয়াল পড়ার পরে, আমি যা পেতাম তা হ'ল:

arr=[];
arr[1]['apple'] = 2;

কিন্তু arr['fred']['apple'] = 2;কাজ করে না আমি বস্তুর অ্যারে চেষ্টা করেছিলাম, তবে বস্তুর বৈশিষ্ট্যগুলি বিনামূল্যে পাঠ্য হতে পারে না। আমি যত বেশি টিউটোরিয়াল পড়ছিলাম, ততই আমি বিভ্রান্ত হয়ে পড়ি ...

কোন ধারণা স্বাগত :)


জবাবের জন্য ধন্যবাদ, তবে আমি ক্যোয়ারির ফলাফলগুলি লুপ করছি, এবং আমি একবারে মানগুলি সেট করতে চাই। উদাহরণের লাইনগুলি (ম্যাট উদাহরণস্বরূপ ফর্মটি গ্রহণ করেছে) var grid = {};grid['aa']['bb'] = 1;"আনকচড টাইপ ইরার: অপরিজ্ঞাতকৃত সম্পত্তি 'বিবি' সেট করতে পারে না" returns আমি ভুল হতে পারি, তবে আপনার বেশিরভাগ উদাহরণ সহ আমাকে প্রাথমিককরণের সময় ডেটাটি জানতে হবে।
ওমিড

সবে যে var grid = {}; grid['aa'] = {}; grid['aa']['bb'] = 1;কাজ করে। আরও জটিল পরীক্ষা ব্যর্থ হয়েছে, তবে মনে হচ্ছে আমি সঠিক পথে
রয়েছি

4
আপনাকে আমার সাব-অবজেক্টটি প্রথমে শুরু করতে হবে, যেমনটি আমি আমার উত্তরে উল্লেখ করেছি। var গ্রিড = {}; grd ['aa'] = {}; তারপরে আপনি গ্রিড করতে পারেন ['aa'] ['বিবি'] = ১। সাব-অবজেক্টটি ইতিমধ্যে সূচনা হয়েছে কিনা তা পরীক্ষা করার জন্য অনেকগুলি উপায় রয়েছে (আমার উত্তর হিসাবে উল্লেখ করা হয়েছে), সুতরাং আপনি কোনও বিদ্যমানটিকে ওভাররাইট করবেন না অবজেক্ট
ম্যাট

কিছু অতিরিক্ত কোড সহ আমার উত্তর আপডেট। আপনার অবজেক্টগুলি কত গভীর, বা আপনি কীভাবে আপনার ডেটা পাচ্ছেন তা নিশ্চিত নন তবে আশা করছি আপনাকে সঠিক দিকে নির্দেশ করবে
ম্যাট

উত্তর:


155

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

var obj = {};

obj['fred'] = {};
if('fred' in obj ){ } // can check for the presence of 'fred'
if(obj.fred) { } // also checks for presence of 'fred'
if(obj['fred']) { } // also checks for presence of 'fred'

// The following statements would all work
obj['fred']['apples'] = 1;
obj.fred.apples = 1;
obj['fred'].apples = 1;

// or build or initialize the structure outright
var obj = { fred: { apples: 1, oranges: 2 }, alice: { lemons: 1 } };

আপনি যদি মূল্যবোধগুলি সন্ধান করেন তবে আপনার কাছে এমন দেখতে কিছু হতে পারে:

var people = ['fred', 'alice'];
var fruit = ['apples', 'lemons'];

var grid = {};
for(var i = 0; i < people.length; i++){
    var name = people[i];
    if(name in grid == false){
        grid[name] = {}; // must initialize the sub-object, otherwise will get 'undefined' errors
    }

    for(var j = 0; j < fruit.length; j++){
        var fruitName = fruit[j];
        grid[name][fruitName] = 0;
    }
}

উত্পাদন কোডে (উদাহরণস্বরূপ, একটি ক্রোম এক্সটেনশন) ব্যবহার করতে পরিচালিত, এবং দুর্দান্ত কাজ করে। ধন্যবাদ পরিশেষে আমি জেএসে কীভাবে অবজেক্ট হ্যান্ডেল করব!
ওমমিড

4
এই উত্তর যথেষ্ট upvote করতে পারবেন না! যে অংশটি আমার অবজেক্টকে ক্রমাগত অপরিবর্তিত করে দেয় তা হ'ল আমি সাব-অবজেক্টটি আরম্ভ করছি না। সুতরাং এটি করতে ভুলবেন না! উদাহরণ: grid[name] = {};
জেসন পুডজিয়ানভস্কি

4
@ ম্যাট কি কেবলমাত্র একটি সেট [] ব্যবহার করে obj.fred.apples পাওয়ার উপায় আছে? আমি ধরে নিচ্ছি না। obj["fred.apples"]উদাহরণস্বরূপ
বিবিআরআরভি

যদি আমরা অ্যারের সংখ্যা জানি না, উদাহরণস্বরূপ আপনার কোড [জাভাস্রিপ্ট] বিভিন্ন লোক = ['ফ্রেড', 'এলিস']; var ফল = ['আপেল', 'লেবু']; বর্ণ বর্ণ = ['লাল', 'নীল'] বর্ণ ..... -> অ্যারের সংখ্যা অজানা [/ জাভাস্ক্রিপ্ট]
ইউকিসাকুরা

আমি কি অঙ্ক সূচক দ্বারা প্রথম আইটেমটি (ফ্রেড) অ্যাক্সেস করতে পারি? আপত্তি [0] এর মতো যা ফল দেয় আপেল: 1, কমলা: 2। আমি কি সর্বশেষ আইটেমটি অ্যাক্সেস করতে পারি (যা এলিস এবং লেবুতে ফলাফল: 1)? `
টিমো

26

যদি না হয় আছে একটি অ্যারের হবে, আপনি একটি "বহুমাত্রিক" জাতীয় বস্তু তৈরি করতে পারেন ...

<script type="text/javascript">
var myObj = { 
    fred: { apples: 2, oranges: 4, bananas: 7, melons: 0 }, 
    mary: { apples: 0, oranges: 10, bananas: 0, melons: 0 }, 
    sarah: { apples: 0, oranges: 0, bananas: 0, melons: 5 } 
}

document.write( myObject[ 'fred' ][ 'apples' ] );
</script>

জেএসএন আসলে জাভাস্ক্রিপ্ট অবজেক্টের 'স্ট্রিংফাইড' ফর্ম্যাট। আপনার যা আছে তা JSON নয়, কেবল একটি জাভাস্ক্রিপ্ট অবজেক্ট।
ম্যাট

ধন্যবাদ, ম্যাট পোস্ট আপডেট হয়েছে।
চার্লিগ্রিফার 21

4
@ চার্লিগ্রিফার, নথিটি হওয়া উচিত নয় w রাইটিং লাইনটি হ'ল: "ডকুমেন্ট.উইরাইট (মাইওবজ ......"
জন

13

জাভাস্ক্রিপ্ট নমনীয়:

var arr = {
  "fred": {"apple": 2, "orange": 4},
  "mary": {}
  //etc, etc
};

alert(arr.fred.orange);
alert(arr["fred"]["orange"]);
for (key in arr.fred)
    alert(key + ": " + arr.fred[key]);

8
আমি বলব ভেরিয়েবলের নাম 'আর' এখানে একটি মিসনোমার, কারণ এটি আসলে অ্যারে নয়, তবে একটি অবজেক্ট।
ম্যাট

আমি একটি অলস কুকুর এবং তাই আপনার সমাধানটি ব্যবহার করতে পারি না। আমি যদি আগ্রহী হতাম তবে আমি আপনার সুব্রায় উদাহরণ দিয়ে আমার পথটি খুঁজে পেতাম;) যাইহোক, আপনার প্রচেষ্টার জন্য ধন্যবাদ।
টিমো

9

যেহেতু আমার সমস্ত উপাদানগুলি একটি সুন্দর উপায়ে পাওয়া দরকার ছিল আমি এই এসও বিষয়টির সাথে "2 মাত্রিক সংশ্লেষমূলক অ্যারে / অবজেক্ট ট্র্যাভারসিং" এর মুখোমুখি হয়েছি - আমার পক্ষে কোনও নামই আসে না কারণ কার্যকারিতা গণনা করা হয়।

var imgs_pl = { 
    'offer':        { 'img': 'wer-handwritter_03.png', 'left': 1, 'top': 2 },
    'portfolio':    { 'img': 'wer-handwritter_10.png', 'left': 1, 'top': 2 },
    'special':      { 'img': 'wer-handwritter_15.png', 'left': 1, 'top': 2 }
};
for (key in imgs_pl) { 
    console.log(key);
    for (subkey in imgs_pl[key]) { 
        console.log(imgs_pl[key][subkey]);
    }
}

উত্তরটি গ্রহণ করা উচিত কারণ একটি লুপ সাধারণত যাওয়ার উপায় way
টিমো

6

এটি প্রদর্শিত হয় যে কিছু অ্যাপ্লিকেশনের জন্য, জাভাস্ক্রিপ্টে বহু-মাত্রিক এসোসিয়েটিভ অ্যারেগুলির জন্য অনেক সহজ পদ্ধতি রয়েছে।

  1. সমস্ত অ্যারের অভ্যন্তরীণ উপস্থাপনা আসলে বস্তুর অবজেক্ট হিসাবে দেখা যায়, এটি দেখানো হয়েছে যে সংখ্যাসূচকভাবে সূচিকৃত উপাদানগুলির অ্যাক্সেসের সময়টি আসলে এসোসিয়েটিভ (পাঠ্য) সূচকযুক্ত উপাদানগুলির জন্য একই।

  2. প্রথম স্তরের সহযোগী সূচকযুক্ত উপাদানগুলির অ্যাক্সেসের সময়টি প্রকৃত উপাদানের সংখ্যা বৃদ্ধির সাথে বৃদ্ধি পায় না।

এটি দেওয়া হয়েছে, এমন অনেকগুলি ক্ষেত্রে থাকতে পারে যেখানে একটি বহুমাত্রিক উপাদানগুলির সমতুল্যতা তৈরি করতে একটি কাঠের স্ট্রিং পদ্ধতির ব্যবহার করা ভাল। উদাহরণ স্বরূপ:

store['fruit']['apples']['granny']['price] = 10
store['cereal']['natural']['oats']['quack'] = 20

যায়:

store['fruit.apples.granny.price'] = 10
store['cereal.natural.oats.quack'] = 20

সুবিধার মধ্যে রয়েছে:

  • উপ-অবজেক্টগুলি আরম্ভ করার প্রয়োজন নেই বা কীভাবে অবজেক্টগুলিকে সর্বোত্তমভাবে সংহত করা যায় তা নির্ধারণ করার দরকার নেই
  • একক স্তরের অ্যাক্সেস সময়। অবজেক্টের মধ্যে থাকা অবজেক্টগুলির অ্যাক্সেসের সময় N বারের প্রয়োজন
  • সমস্ত মাত্রা তথ্য নিষ্কাশন করতে অবজেক্ট.কিজ () ব্যবহার করতে পারেন এবং ..
  • আপনি যা চান ঠিক তা টানতে কীগুলিতে regex.test (স্ট্রিং) এবং অ্যারে.ম্যাপ ফাংশনটি ব্যবহার করতে পারেন।
  • মাত্রাগুলিতে কোনও শ্রেণিবদ্ধতা নেই।
  • "ডট" নির্বিচারে - আন্ডারস্কোর ব্যবহার করা আসলে রিজেক্সকে আরও সহজ করে তোলে
  • "সমতলকরণ" এর জন্য JSON এর প্রচুর স্ক্রিপ্টও রয়েছে এই ফর্ম্যাটটিতে এবং বাইরেও
  • কীলিস্টে অন্য দুর্দান্ত অ্যারে প্রসেসিং ফাংশনগুলি সমস্ত ব্যবহার করতে পারে

3

সম্পত্তির নামটি পূর্ণসংখ্যার সাথে মিশে থাকা অ্যারেগুলির সংস্থার একটি অ্যারের মান পান:

একটি সহযোগী অ্যারে দিয়ে শুরু করা যেখানে সম্পত্তির নামগুলি পূর্ণসংখ্যা হয়:

var categories = [
    {"1":"Category 1"},
    {"2":"Category 2"},
    {"3":"Category 3"},
    {"4":"Category 4"}
];

অ্যারে আইটেম পুশ করুন:

categories.push({"2300": "Category 2300"});
categories.push({"2301": "Category 2301"});

অ্যারের মাধ্যমে লুপ করুন এবং সম্পত্তি মান সহ কিছু করুন।

for (var i = 0; i < categories.length; i++) {
    for (var categoryid in categories[i]) {
        var category = categories[i][categoryid];
        // log progress to the console
        console.log(categoryid + " : " + category);
        //  ... do something
    }
}

কনসোল আউটপুট এর মতো দেখতে হবে:

1 : Category 1
2 : Category 2
3 : Category 3
4 : Category 4
2300 : Category 2300
2301 : Category 2301

যেমন আপনি দেখতে পাচ্ছেন, আপনি সমিতির অ্যারে সীমাবদ্ধতাটি পেতে পারেন এবং একটি সম্পত্তির নাম পূর্ণসংখ্যা হতে পারেন।

দ্রষ্টব্য: আমার উদাহরণের সহযোগী অ্যারে হ'ল জসন হ'ল যদি আপনি কোনও অভিধান [] অবজেক্টকে সিরিয়াল করে তোলেন।


3

কোনও অ্যারে ব্যবহার করবেন না, কোনও বস্তু ব্যবহার করুন।

var foo = new Object();

4
একটি ব্যবহার করবেন না new Object(), যেহেতু অবজেক্ট.প্রোটোটাইপটির সাথে অদ্ভুততা সংযুক্ত থাকতে পারে; আক্ষরিক অবজেক্টটি ব্যবহার করুন:var foo = {};
মাইকেল পাউলুকোনিস

4
@ মিশেল আমি ভেবেছিলাম {new কেবলমাত্র নতুন অবজেক্টের জন্য সিনট্যাকটিক চিনি (); অনেকটা পছন্দ [] নতুন অ্যারে ()
ম্যাট

4
আমার ক্রোম জেএস কনসোল থেকে, এই দুটি কনস্ট্রাকটই তাদের প্রোটোটাইপগুলি সহ অভিন্ন দেখায়। এমনকি অবজেক্ট.প্রোটোটাইপ.ফু = ফাংশন () adding adding যুক্ত করা উভয় ক্ষেত্রেই উপস্থিত হয়।
ম্যাট

4
@ ম্যাট আমার মনে হয় আমি ভুল করছি আমি এটিকে মিশিয়ে দিচ্ছি new Array()যা এড়ানো উচিত। উঃ
মাইকেল পাউলুকোনিস

4
@ মিশেল কেন নতুন অ্যারে () এড়ানো উচিত?
ম্যাট

2

আপনাকে অবজেক্টস অগত্যা ব্যবহার করার দরকার নেই, আপনি এটি সাধারণ বহুমাত্রিক অ্যারে দিয়ে করতে পারেন।

এটি অবজেক্ট ছাড়াই আমার সমাধান :

// Javascript
const matrix = [];

matrix.key1 = [
  'value1',
  'value2',
];

matrix.key2 = [
  'value3',
];

যা পিএইচপি-তে সমান:

// PHP
$matrix = [
    "key1" => [
        'value1',
        'value2',
    ],
    "key2" => [
        'value3',
    ]
];

4
আপনি কীভাবে পরে এটিকে লুপ করবেন (প্রতিটি ব্যবহার করুন)?
সেগিভ এসইও

0

<script language="javascript">

// Set values to variable
var sectionName = "TestSection";
var fileMap = "fileMapData";
var fileId = "foobar";
var fileValue= "foobar.png";
var fileId2 = "barfoo";
var fileValue2= "barfoo.jpg";

// Create top-level image object
var images = {};

// Create second-level object in images object with
// the name of sectionName value
images[sectionName] = {};

// Create a third level object
var fileMapObj = {};

// Add the third level object to the second level object
images[sectionName][fileMap] = fileMapObj;

// Add forth level associate array key and value data
images[sectionName][fileMap][fileId] = fileValue;
images[sectionName][fileMap][fileId2] = fileValue2;


// All variables
alert ("Example 1 Value: " + images[sectionName][fileMap][fileId]);

// All keys with dots
alert ("Example 2 Value: " + images.TestSection.fileMapData.foobar);

// Mixed with a different final key
alert ("Example 3 Value: " + images[sectionName]['fileMapData'][fileId2]);

// Mixed brackets and dots...
alert ("Example 4 Value: " + images[sectionName]['fileMapData'].barfoo);

// This will FAIL! variable names must be in brackets!
alert ("Example 5 Value: " + images[sectionName]['fileMapData'].fileId2);
// Produces: "Example 5 Value: undefined".

// This will NOT work either. Values must be quoted in brackets.
alert ("Example 6 Value: " + images[sectionName][fileMapData].barfoo);
// Throws and exception and stops execution with error: fileMapData is not defined

// We never get here because of the uncaught exception above...
alert ("The End!");
</script>


0
    var myObj = [];
    myObj['Base'] = [];
    myObj['Base']['Base.panel.panel_base'] = {ContextParent:'',ClassParent:'',NameParent:'',Context:'Base',Class:'panel',Name:'panel_base',Visible:'',ValueIst:'',ValueSoll:'',
                                              Align:'',  AlignFrom:'',AlignTo:'',Content:'',onClick:'',Style:'',content_ger_sie:'',content_ger_du:'',content_eng:'' };
    myObj['Base']['Base.panel.panel_top']  = {ContextParent:'',ClassParent:'',NameParent:'',Context:'Base',Class:'panel',Name:'panel_base',Visible:'',ValueIst:'',ValueSoll:'',
                                              Align:'',AlignFrom:'',AlignTo:'',Content:'',onClick:'',Style:'',content_ger_sie:'',content_ger_du:'',content_eng:'' };

    myObj['SC1'] = [];
    myObj['SC1']['Base.panel.panel_base'] = {ContextParent:'',ClassParent:'',NameParent:'',Context:'Base',Class:'panel',Name:'panel_base',Visible:'',ValueIst:'',ValueSoll:'',
                                              Align:'',  AlignFrom:'',AlignTo:'',Content:'',onClick:'',Style:'',content_ger_sie:'',content_ger_du:'',content_eng:'' };
    myObj['SC1']['Base.panel.panel_top']  = {ContextParent:'',ClassParent:'',NameParent:'',Context:'Base',Class:'panel',Name:'panel_base',Visible:'',ValueIst:'',ValueSoll:'',
                                              Align:'',AlignFrom:'',AlignTo:'',Content:'',onClick:'',Style:'',content_ger_sie:'',content_ger_du:'',content_eng:'' };


    console.log(myObj);

    if ('Base' in myObj) {
      console.log('Base found');

      if ('Base.panel.panel_base' in myObj['Base'])  {
        console.log('Base.panel.panel_base found'); 


      console.log('old value: ' + myObj['Base']['Base.panel.panel_base'].Context);  
      myObj['Base']['Base.panel.panel_base'] = 'new Value';
      console.log('new value: ' + myObj['Base']['Base.panel.panel_base']);
      }
    }

আউটপুট:

  • বেস পাওয়া গেছে
  • বেস.প্যানেল.প্যানেল_বাস পাওয়া গেছে
  • পুরাতন মান: বেস
  • নতুন মান: নতুন মান

অ্যারে অপারেশন কাজ করে। কোন সমস্যা নেই.

সংক্ষেপণ:

     Object.keys(myObj['Base']).forEach(function(key, index) {            
        var value = objcons['Base'][key];                   
      }, myObj);

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