2017-10-15 99 views
0

是否可以创建可以像数组和对象一样使用的对象?创建可以像数组和对象一样使用的JavaScript数组对象

到目前为止,我已经得到的最接近的是下面这只是使得你可以使用数组键分配一个值或对象属性:

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

我想能够自动创建分配不存在的项目时所需的内容,例如

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

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

你想得到什么样的行为,与普通的JS对象不同,即'var a = {}'? – Ryan1729

回答

0

我相信你会发现在Javascript正常ArraysObject继承,这意味着你可以虐待他们就像普通的对象,如果你想。

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

有可能的原因不能不是它是非常混乱做到这一点其他的,但我相信它会满足您的要求,无需代码!

编辑:在阅读了下面的一些评论后,似乎OP由于某种原因想要访问以Object模式添加的属性作为阵列成员。如果您需要,可以使用Object.keys(MyArray)而不是,如上面控制台输出的最后一行所示。

+0

@克雷格,这是否符合你的用例?如果没有,请告诉我它不做什么。 – Mobius

+0

不是。我想要使​​用索引(0,1,2,3等)或键('key','first_name','age'等)访问相同的值。因此,对于返回“值”的MyArray ['key']的示例,我也希望能够使用MyArray [3]并获取“value”。如果我使用'key'或者3来设置新值,我会希望它同时更新。我也想要长度返回值的数量'钥匙'和3被计为1(同样的事情) – Craig