जावास्क्रिप्ट में बहुआयामी साहचर्य सरणियाँ


84

निम्नलिखित क्वेरी परिणाम हैं: (की 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

PHP में यह साहचर्य सरणियों का उपयोग करके वास्तव में आसान होगा:

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

लेकिन इस तरह से जावास्क्रिप्ट सहयोगी सरणियों में काम नहीं करता है। ट्यूटोरियल के टन को पढ़ने के बाद, मुझे केवल इतना मिल सकता है:

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

लेकिन arr['fred']['apple'] = 2;काम नहीं करता। मैंने वस्तुओं के सरणियों की कोशिश की, लेकिन वस्तुओं के गुण मुक्त पाठ नहीं हो सकते। जितना मैं ट्यूटोरियल पढ़ रहा था, उतना ही मैं भ्रमित हो रहा था ...

किसी भी विचार का स्वागत है :)


उत्तर के लिए धन्यवाद, लेकिन मैं क्वेरी परिणामों के माध्यम से लूप कर रहा हूं, और मैं एक समय में एक मान सेट करना चाहता हूं। उदाहरण रेखाएँ (लिया गया मैट उदाहरण) var grid = {};grid['aa']['bb'] = 1;"अनट्रेड टाइप टाइप: रिटर्न: अपरिभाषित की संपत्ति 'बी बी सेट नहीं कर सकता है"। मैं गलत हो सकता है, लेकिन आपके अधिकांश उदाहरणों के साथ मुझे आरंभीकरण के समय डेटा जानना होगा।
ओमिडिक डे

बस वह var grid = {}; grid['aa'] = {}; grid['aa']['bb'] = 1;काम कर पाया । एक अधिक जटिल परीक्षण विफल हो जाता है, लेकिन ऐसा लगता है कि मैं सही रास्ते पर
हूं

2
आपको पहले उप-ऑब्जेक्ट को इनिशियलाइज़ करना होगा, जैसा कि मैंने अपने उत्तर में बताया है। var ग्रिड = {}; जीआरडी ['आ'] = {}; फिर आप ग्रिड ['एए'] ['बी बी'] कर सकते हैं = 1. यह देखने के लिए कई तरीके हैं कि क्या उप-ऑब्जेक्ट पहले से ही आरंभिक है (जैसा कि मेरे उत्तर में उल्लेख किया गया है), इसलिए आप किसी मौजूदा को अधिलेखित नहीं करते हैं वस्तु।
मैट

कुछ अतिरिक्त कोड के साथ मेरे जवाब को अपडेट किया। यकीन नहीं है कि आपकी वस्तुएं कितनी गहरी हैं, या आप अपना डेटा कैसे प्राप्त कर रहे हैं, लेकिन उम्मीद है कि आप सही दिशा में इंगित करेंगे
मैट

जवाबों:


152

बस एक नियमित जावास्क्रिप्ट ऑब्जेक्ट का उपयोग करें, जो आपके सहयोगी सरणियों के समान ही 'पढ़ेगा'। आपको उन्हें पहले शुरू करने के लिए याद रखना होगा।

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;
    }
}

उत्पादन कोड (एक क्रोम एक्सटेंशन) पर उदाहरण का उपयोग करने के लिए प्रबंधित, और ठीक काम करता है। धन्यवाद। अंत में मैं कैसे जेएस में वस्तु को संभालने के लिए हो रहा है!
ओमिडियम

3
इस उत्तर को पर्याप्त नहीं बना सकते हैं! वह हिस्सा जो मेरी वस्तु को लगातार अपरिभाषित करने के लिए पैदा कर रहा था, वह यह था कि मैं उप-ऑब्जेक्ट को शुरू नहीं कर रहा था। तो ऐसा करना सुनिश्चित करें! उदाहरण: grid[name] = {};
जेसन पुडज़ेनोव्स्की

1
@ मैट वहाँ obj.fred.apples पाने का एक तरीका है [] के केवल एक सेट का उपयोग कर? मैं नहीं मान रहा हूँ। obj["fred.apples"]उदाहरण के लिए
TheB3RV

क्या होगा अगर हम सरणी की संख्या नहीं जानते हैं, उदाहरण के लिए आपका कोड [javasript] var लोग = ['fred', 'alice']; var फल = ['सेब', 'नींबू']; var रंग = ['लाल', 'नीला'] var ..... -> सरणी की संख्या अज्ञात है [/ javascript]
युकीसकुरा २

क्या मैं संख्यात्मक सूचकांक द्वारा ओब्ज (फ्रेड) में पहला आइटम एक्सेस कर सकता हूं? ओब्ज की तरह [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 वास्तव में जावास्क्रिप्ट ऑब्जेक्ट का 'कड़ा' प्रारूप है। आपके पास JSON नहीं है, सिर्फ एक जावास्क्रिप्ट ऑब्जेक्ट है।
मैट

धन्यवाद, मैट। पोस्ट को अपडेट किया।
चार्लीग्रेफर

1
@charliegriefer, document.write लाइन नहीं होना चाहिए: "document.write (myObj ......"
जॉन

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]);
    }
}

उत्तर स्वीकार किया जाना चाहिए क्योंकि एक लूप आमतौर पर जाने का रास्ता है।
टिमो

5

ऐसा प्रतीत होता है कि कुछ अनुप्रयोगों के लिए, जावास्क्रिप्ट में बहु आयामी सहयोगी सरणियों के लिए कहीं अधिक सरल दृष्टिकोण है।

  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

लाभ में शामिल हैं:

  • सब-ऑब्जेक्ट्स को इनिशियलाइज़ करने की कोई ज़रूरत नहीं है या यह पता लगाने की ज़रूरत नहीं है कि ऑब्जेक्ट्स को कैसे संयोजित किया जाए
  • एकल-स्तरीय पहुंच का समय। वस्तुओं के भीतर वस्तुओं को एन टाइम एक्सेस समय की आवश्यकता होती है
  • सभी आयाम जानकारी निकालने के लिए Object.keys () का उपयोग कर सकते हैं और ।।
  • फ़ंक्शन regex.test (string) और array.map फ़ंक्शन को कुंजियों पर उपयोग कर सकते हैं ताकि आप जो चाहें निकाल सकें।
  • आयामों में कोई पदानुक्रम नहीं।
  • "डॉट" मनमाना है - अंडरस्कोर का उपयोग वास्तव में रेगेक्स को आसान बनाता है
  • 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

जैसा कि आप देख सकते हैं, आप सहयोगी सरणी सीमा के आसपास प्राप्त कर सकते हैं और एक संपत्ति का नाम पूर्णांक हो सकता है।

नोट: मेरे उदाहरण में साहचर्य सरणी आप एक शब्दकोश [] वस्तु serialized अगर आप होता है जब आप होता है।


3

एक सरणी का उपयोग न करें, एक वस्तु का उपयोग करें।

var foo = new Object();

2
new Object()ऑब्जेक्ट का उपयोग न करें , क्योंकि Object.prototype में इससे जुड़ी अजीबता हो सकती है; ऑब्जेक्ट शाब्दिक का उपयोग करें:var foo = {};
माइकल पॉलुकॉनिस

1
@ मिचेल ने सोचा कि {} नई वस्तु () के लिए सिर्फ वाक्यरहित चीनी थी; बहुत कुछ [] नए ऐरे के लिए छोटा है ()
मैट

1
मेरे Chrome JS कंसोल से, ये दोनों अवरोधक समान दिखाई देते हैं, जिसमें उनके प्रोटोटाइप भी शामिल हैं। यहां तक ​​कि Object.prototyp.foo = function () {} दोनों को जोड़ने पर भी।
मैट

1
@ मैट मुझे लगता है कि मैं गलत हूं मैं इसे मिला रहा था new Array()जिसके साथ बचा जाना चाहिए। ओह।
माइकल पॉलुकोनिस 21

1
@ मिचेल को नए ऐरे () से क्यों बचना चाहिए?
मैट 21

2

आपको आवश्यक रूप से वस्तुओं का उपयोग करने की आवश्यकता नहीं है, आप इसे सामान्य बहुआयामी ऐरे के साथ कर सकते हैं।

यह वस्तुओं के बिना मेरा समाधान है :

// Javascript
const matrix = [];

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

matrix.key2 = [
  'value3',
];

जो PHP में बराबर है:

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

1
आप इसे बाद में कैसे (प्रत्येक का उपयोग करें) लूप करते हैं?
सगिव एसईओ

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']);
      }
    }

आउटपुट:

  • आधार मिला
  • Base.panel.panel_base मिला
  • पुराना मूल्य: आधार
  • नया मूल्य: नया मूल्य

सरणी ऑपरेशन काम करता है। कोई समस्या नहीं है।

पुनरावृत्ति:

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

2
Stackoverflow में आपका स्वागत है। कृपया अपना उत्तर संपादित करें और बताएं कि आपका कोड स्निपेट समस्या का समाधान क्यों करता है। यहां अधिक जानकारी: उत्तर कैसे दें
जेन्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.