以对象的形式添加一些语法糖怎么样OrderedObject
?然后你可以做这样的事情:
myObj = new OrderedObject();
myObj.add('alz', '15a');
myObj.add('aly', '16b');
myObj.add('alx', '17a');
myObj.add('alw', '09c');
console.log(myObj.keyAt(2)); // 'alx'
console.log(myObj.valueAt(3)); // '09c'
console.log(myObj.indexOf('aly')); // 1
console.log(myObj.length()) // 4
console.log(myObj.nextKey('aly')); // 'alx'
下面的代码使这项工作。在 jsFiddle 中查看它的实际效果。
function OrderedObject() {
var index = [];
this.add = function(key, value) {
if (!this.hasOwnProperty(key)) {
index.push(key);
}
this[key] = value;
};
this.remove = function(key) {
if (!this.hasOwnProperty(key)) { return; }
index.splice(index.indexOf(key), 1);
delete this[key];
}
this.indexOf = function(key) {
return index.indexOf(key);
}
this.keyAt = function(i) {
return index[i];
};
this.length = function() {
return index.length;
}
this.valueAt = function(i) {
return this[this.keyAt(i)];
}
this.previousKey = function(key) {
return this.keyAt(this.indexOf(key) - 1);
}
this.nextKey = function(key) {
return this.keyAt(this.indexOf(key) + 1);
}
}
我做了一些可能不适合你的决定。例如,我选择使用 anObject
作为原型而不是 an Array
,这样您就可以保留使用 枚举您的对象for (key in myObj)
。但它不一定是那样的。它可能是一个Array
,让您使用属性.length
而不是函数.length()
,然后提供一个each
枚举键的函数,或者可能是一个.object()
返回内部对象的函数。
这可能有点尴尬,因为您必须记住不要自己向对象添加项目。也就是说,如果您这样做myObj[key] = 'value';
,则index
不会更新。我也没有提供任何重新排列事物顺序或将它们插入特定位置或按位置删除的方法。但是,如果您发现我的对象想法有用,我相信您可以弄清楚如何添加这些东西。
使用较新版本的 EcmaScript,您可以添加真正的属性并使它们不可枚举。这将允许新对象更无缝、更流畅地运行,就像我想象的理想 OrderedObject 一样。