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);
}
}
私はあなたのために働かないかもしれないいくつかの決定をしました。たとえば、オブジェクトの列挙を。で保持できるようにObject
、プロトタイプとしてではなくを使用することを選択しました。しかし、そのようにする必要はありませんでした。これは、関数の代わりにプロパティを使用して、キーを列挙する関数、または内部オブジェクトを返す関数を提供することである可能性があります。Array
for (key in myObj)
Array
.length
.length()
each
.object()
オブジェクトにアイテムを自分で追加しないことを覚えておく必要があるため、これは少し厄介かもしれません。つまり、myObj[key] = 'value';
そうすると、index
は更新されません。また、物事の順序を並べ替えたり、特定の位置に挿入したり、位置ごとに削除したりする方法も提供していません。ただし、私のオブジェクトのアイデアが役立つと思われる場合は、そのようなものを追加する方法を理解できると確信しています。
新しいバージョンのEcmaScriptを使用すると、真のプロパティを追加して、それらを列挙できないようにすることができます。これにより、新しいオブジェクトが、私が想像している理想的なOrderedObjectのようにシームレスかつスムーズに動作できるようになります。