إنشاء المفاتيح ديناميكيًا في مصفوفة JavaScript النقابية

StackOverflow https://stackoverflow.com/questions/351495

  •  20-08-2019
  •  | 
  •  

سؤال

كيف يمكنني إنشاء مفاتيح ديناميكيًا في صفائف جافا سكريبت الترابطية؟

جميع الوثائق التي وجدتها حتى الآن هي لتحديث المفاتيح التي تم إنشاؤها بالفعل:

 arr['key'] = val;

لدي سلسلة مثل هذا " name = oscar "

وأريد أن ينتهي الأمر بشيء مثل هذا:

{ name: 'whatever' }

أي أنني قمت بتقسيم السلسلة والحصول على العنصر الأول، وأريد أن أضع ذلك في القاموس.

شفرة

var text = ' name = oscar '
var dict = new Array();
var keyValuePair = text.split(' = ');
dict[ keyValuePair[0] ] = 'whatever';
alert( dict ); // prints nothing.
هل كانت مفيدة؟

المحلول

استخدم المثال الأول. إذا لم المفتاح غير موجود يتم إضافتها.

var a = new Array();
a['name'] = 'oscar';
alert(a['name']);

هل يطفو على السطح مربع الرسالة تحتوي على 'أوسكار'.

وجرب:

var text = 'name = oscar'
var dict = new Array()
var keyValuePair = text.replace(/ /g,'').split('=');
dict[ keyValuePair[0] ] = keyValuePair[1];
alert( dict[keyValuePair[0]] );

نصائح أخرى

بطريقة ما، جميع الأمثلة، على الرغم من أنها تعمل بشكل جيد، إلا أنها معقدة للغاية:

  • هم يستخدمون new Array(), ، وهو مبالغة (وحمل إضافي) لمصفوفة ترابطية بسيطة (قاموس AKA).
  • الأفضل منها استخدامها new Object().يعمل بشكل جيد، ولكن لماذا كل هذه الكتابة الإضافية؟

تم تصنيف هذا السؤال على أنه "مبتدئ"، لذا دعونا نجعله بسيطًا.

الطريقة البسيطة لاستخدام قاموس في JavaScript أو "لماذا لا تحتوي JavaScript على كائن قاموس خاص؟":

// create an empty associative array (in JavaScript it is called ... Object)
var dict = {};   // huh? {} is a shortcut for "new Object()"

// add a key named fred with value 42
dict.fred = 42;  // we can do that because "fred" is a constant
                 // and conforms to id rules

// add a key named 2bob2 with value "twins!"
dict["2bob2"] = "twins!";  // we use the subscript notation because
                           // the key is arbitrary (not id)

// add an arbitrary dynamic key with a dynamic value
var key = ..., // insanely complex calculations for the key
    val = ...; // insanely complex calculations for the value
dict[key] = val;

// read value of "fred"
val = dict.fred;

// read value of 2bob2
val = dict["2bob2"];

// read value of our cool secret key
val = dict[key];

الآن دعونا نغير القيم:

// change the value of fred
dict.fred = "astra";
// the assignment creates and/or replaces key-value pairs

// change value of 2bob2
dict["2bob2"] = [1, 2, 3];  // any legal value can be used

// change value of our secret key
dict[key] = undefined;
// contrary to popular beliefs assigning "undefined" does not remove the key

// go over all keys and values in our dictionary
for (key in dict) {
  // for-in loop goes over all properties including inherited properties
  // let's use only our own properties
  if (dict.hasOwnProperty(key)) {
    console.log("key = " + key + ", value = " + dict[key]);
  }
}

يعد حذف القيم أمرًا سهلاً أيضًا:

// let's delete fred
delete dict.fred;
// fred is removed, the rest is still intact

// let's delete 2bob2
delete dict["2bob2"];

// let's delete our secret key
delete dict[key];

// now dict is empty

// let's replace it, recreating all original data
dict = {
  fred:    42,
  "2bob2": "twins!"
  // we can't add the original secret key because it was dynamic,
  // we can only add static keys
  // ...
  // oh well
  temp1:   val
};
// let's rename temp1 into our secret key:
if (key != "temp1") {
  dict[key] = dict.temp1; // copy the value
  delete dict.temp1;      // kill the old key
} else {
  // do nothing, we are good ;-)
}

وجافا سكريبت <م> لم يكن لديك صفائف النقابي ، فقد <م> التحف .

والأسطر التالية من التعليمات البرمجية جميعا أن نفعل نفس الشيء بالضبط - تعيين حقل 'اسم' على كائن إلى 'اوريون'

var f = new Object(); f.name = 'orion';
var f = new Object(); f['name'] = 'orion';
var f = new Array(); f.name = 'orion';
var f = new Array(); f['name'] = 'orion';
var f = new XMLHttpRequest(); f['name'] = 'orion';

ويبدو ان لديك مجموعة النقابي لأن Array هو أيضا Object - ومع ذلك فأنت لا إضافة أشياء إلى مجموعة على الإطلاق، كنت تحديد المجالات على الكائن

والآن بعد أن تم تطهير، وهنا هو إيجاد حل عملي لمثالك

var text = '{ name = oscar }'
var dict = new Object();

// Remove {} and spaces
var cleaned = text.replace(/[{} ]/g, '');

// split into key and value
var kvp = cleaned.split('=');

// put in the object
dict[ kvp[0] ] = kvp[1];
alert( dict.name ); // prints oscar.

وردا على MK_Dev، واحد قادر على تكرار، ولكن ليس <م> على التوالي. (لذلك من الواضح أن هناك حاجة إلى مجموعة)

والبحث جوجل سريع إحضار في جافا سكريبت

وكود مثال للحلقات على القيم في تجزئة (من الارتباط المذكور):

var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;

// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}

الكود الأصلي (لقد أضفت أرقام الأسطر حتى أتمكن من الرجوع إليها):

1  var text = ' name = oscar '
2  var dict = new Array();
3  var keyValuePair = text.split(' = ');
4  dict[ keyValuePair[0] ] = 'whatever';
5  alert( dict ); // prints nothing.

اوشكت على الوصول...

  • خط 1:يجب عليك أن تفعل trim على النص لذلك هو name = oscar.
  • السطر 3:حسنًا طالما أن لديك دائمًا مسافات حول مساواتك.قد يكون من الأفضل عدم القيام بذلك trim في السطر 1، استخدم = وقم بقص كل keyValuePair
  • أضف سطرًا بعد 3 وقبل 4:

    key = keyValuePair[0];`
    
  • السطر 4:يصبح الآن:

    dict[key] = keyValuePair[1];
    
  • السطر 5:التغيير إلى:

    alert( dict['name'] );  // it will print out 'oscar'
    

ما أحاول قوله هو أن dict[keyValuePair[0]] لا يعمل، تحتاج إلى تعيين سلسلة ل keyValuePair[0] واستخدام ذلك كمفتاح النقابي.هذه هي الطريقة الوحيدة التي جعلتني أعمل.بعد قيامك بإعداده، يمكنك إما الرجوع إليه باستخدام فهرس رقمي أو إدخال علامات الاقتباس.

امل ان يساعد.

جميع المتصفحات الحديثة تدعم أ خريطة, ، وهو تقييد بيانات المفتاح/القيمة.هناك عدة أسباب تجعل استخدام الخريطة أفضل من استخدام الكائن:

  • يحتوي الكائن على نموذج أولي، لذا توجد مفاتيح افتراضية في الخريطة.
  • مفاتيح الكائن هي سلاسل، حيث يمكن أن تكون أي قيمة للخريطة.
  • يمكنك الحصول على حجم الخريطة بسهولة بينما يتعين عليك تتبع حجم الكائن.

مثال:

var myMap = new Map();

var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";

myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

myMap.size; // 3

myMap.get(keyString);    // "value associated with 'a string'"
myMap.get(keyObj);       // "value associated with keyObj"
myMap.get(keyFunc);      // "value associated with keyFunc"

إذا كنت تريد أن يتم جمع البيانات المهملة للمفاتيح التي لم تتم الإشارة إليها من كائنات أخرى، ففكر في استخدام ملف خريطة ضعيفة بدلاً من الخريطة.

وأعتقد أنه من الأفضل لو قمت بإنشائها مثل هذا

var arr = [];

arr = {
   key1: 'value1',
   key2:'value2'
};

لمزيد من المعلومات، نلقي نظرة على هذا

هياكل البيانات جافا سكريبت - صفيف النقابي

var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}

وهذا على ما يرام ولكن بالتكرار من خلال كل خاصية الكائن مجموعة. إذا كنت ترغب في تكرار فقط من خلال خصائص myArray.one، myArray.two ... حاولت مثل هذا

myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
myArray.push("one");
myArray.push("two");
myArray.push("three");
for(i=0;i<maArray.length;i++{
    console.log(myArray[myArray[i]])
}

والآن يمكنك الوصول إلى كل من myArray [ "واحد"] وتكرار إلا من خلال هذه الخصائص.

var obj = {};

                for (i = 0; i < data.length; i++) {
                    if(i%2==0) {
                        var left = data[i].substring(data[i].indexOf('.') + 1);
                        var right = data[i + 1].substring(data[i + 1].indexOf('.') + 1);

                        obj[left] = right;
                        count++;
                    }
                }
                console.log("obj");
                console.log(obj);
                // show the values stored
                for (var i in obj) {
                    console.log('key is: ' + i + ', value is: ' + obj[i]);
                }

            }
        };

و}

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top