2017-10-15 7 views
0

Est-il possible de créer un objet pouvant être utilisé comme un tableau et un objet?Création d'un objet de type tableau JavaScript pouvant être utilisé comme un tableau et un objet

Le plus proche que je l'ai obtenu à ce jour est ci-dessous qui vient vous permet d'attribuer une valeur à l'aide soit une clé de tableau ou objet propriété:

var ALO = { 
 
    db: {} 
 
}; 
 
Object.defineProperty(ALO, 'length', { 
 
    get: function() { 
 
    var count = 0; 
 
    for (var prop in ALO.db) { 
 
     if (ALO.db.hasOwnProperty(prop)) count++; 
 
    } 
 
    return count; 
 
    }, 
 
    enumerable: false 
 
}); 
 

 
function add(baseObj, obj) { 
 
    for (var prop in obj) { 
 
    if (obj.hasOwnProperty(prop)) { 
 
     if (!isNaN(prop)) { 
 
     //create a default string begining with i 
 
     baseObj.db["i" + prop] = obj[prop]; 
 
     } else { 
 
     baseObj.db[prop] = obj[prop]; 
 
     } 
 

 
     Object.defineProperty(baseObj, prop, { 
 
     get: function() { 
 
      return baseObj.db[prop]; 
 
     }, 
 
     set: function(newValue) { 
 
      baseObj.db[prop] = newValue; 
 
     }, 
 
     enumerable: false, 
 
     configurable: true 
 
     }); 
 

 
     Object.defineProperty(baseObj, baseObj.length - 1, { 
 
     get: function() { 
 
      return baseObj.db[prop]; 
 
     }, 
 
     set: function(newValue) { 
 
      baseObj.db[prop] = newValue; 
 
     }, 
 
     enumerable: false, 
 
     configurable: true 
 
     }); 
 
    } 
 
    } 
 
} 
 

 
add(ALO, { 
 
    "myprop": "myvalue" 
 
}); 
 
document.write(ALO["myprop"] + "<br>"); 
 
ALO[0] = "mynewvalue"; 
 
document.write(ALO["myprop"] + "<br>"); 
 
ALO["myprop"] = "mynewervalue"; 
 
document.write(ALO["myprop"]);

Je voudrais pouvoir créer automatiquement ce qui est nécessaire lors de l'attribution d'un élément non existant, par exemple

ALO[1] = "create and assign this string"; 

ou

ALO["somenonexistingprop"] = "another string"; 
+0

http://www.nfriedly.com/techblog/2009/06/advanced-javascript-objects-arrays-and-array-like-objects/ – Barmar

+0

http://2ality.com/2013/05/quirk- array-like-objects.html – Barmar

+0

Quel comportement essayez-vous d'obtenir qui est différent d'un objet JS normal, c'est-à-dire 'var a = {}'? – Ryan1729

Répondre

0

Je crois que vous constaterez que Arrays normal Javascript héritent de Object, ce qui signifie que vous pouvez les abus comme des objets normaux si vous voulez.

let MyArray = [1, 2, 3]; 
 
console.log('let MyArray = [1, 2, 3];'); 
 

 
console.log('Typeof MyArray = ', typeof(MyArray)); 
 

 
console.log('Wait.....'); 
 

 
console.log('So can I just assign stuff to an array like an object?'); 
 

 
MyArray['key'] = 'value'; 
 
console.log(`MyArray.key = 'value';`); 
 
console.log('console.log(MyArray.key) =>', JSON.stringify(MyArray.key)); 
 

 
console.log('Keys:', JSON.stringify(Object.keys(MyArray))); 
 
console.log('Array Length:', MyArray.length); 
 

 
console.log('TADA, the standard browser Array does what you want');

Il y a probablement des raisons de ne pas le faire autre que étant très confus, mais je crois qu'il répondrait à vos besoins, et ne nécessite pas de code! Après avoir lu certains des commentaires ci-dessous le pli, il semble que l'OP pour une raison quelconque veut accéder aux propriétés ajoutées en mode Object en tant que membres du tableau. Si vous en avez besoin, vous pouvez simplement utiliser Object.keys(MyArray) au lieu de comme démontré dans les dernières lignes de la sortie de la console ci-dessus.

+0

@Craig, est-ce que cela correspond à votre cas d'utilisation? Sinon, dites-moi ce qu'il ne fait pas. – Mobius

+0

Pas vraiment. Je voudrais accéder à la même valeur en utilisant l'index (0,1,2,3 etc) ou la clé ('key', 'first_name', 'age', etc.). Donc pour votre exemple de MyArray ['key'] qui retourne "value" je voudrais aussi pouvoir utiliser MyArray [3] et obtenir "value". Et si je définis une nouvelle valeur en utilisant soit 'clé' ou 3 je voudrais le mettre à jour les deux. Je voudrais aussi que length renvoie le nombre de valeurs où 'key' et 3 sont comptés comme 1 (la même chose) – Craig