2

私は次のような連想配列を持っています:

var arr = {};
arr['alz'] = '15a';
arr['aly'] = '16b';
arr['alx'] = '17a';
arr['alw'] = '09c';

選択した要素の前と次のキーを見つける必要があります。たとえば、キー「aly」の場合は「alz」と「alx」になります。可能であれば、キーではなくインデックスで配列にアクセスしたいと思います。

現在、私はキーを含む別の配列を使用してこれを行っています。

var arrkeys = ['alz','aly','alx','alw'];
4

5 に答える 5

5

オブジェクトのプロパティの順序は未定義です。この構造を使用できます...

[{ key: 'alz', value: '15a'},
 { key: 'aly', value: '16b'},
 { key: 'alx', value: '17a'}]

...与えられたキーで要素を検索することは('のような要素を私に与えてください)、単純なオブジェクトの場合ほど簡単ではありませんkey'alz'そのため、これを使用したように(インデックスの順序付け用に個別の配列を提供する)、もう1つの一般的なアプローチがあります。この配列をそのオブジェクトにアタッチできます、ところで:

var arr={};
arr['alz']='15a';
arr['aly']='16b';
arr['alx']='17a';
arr['alw']='09c';
arr._keysOrder = ['alz', 'aly', 'alx', 'alw'];
于 2012-12-29T21:22:35.153 に答える
2

これは配列ではなくオブジェクトであり、これらの文字列をキーにしたくないようです。

素敵な配列はどうですか?

var ar = [
  { key: 'alz', value: '15a' },
  { key: 'aly', value: '16b' },
  { key: 'alx', value: '17a' },
  { key: 'alw', value: '09c' }
];
于 2012-12-29T21:23:03.553 に答える
1

すべての順序を知る必要があり、それでもキー値を使用する必要がある場合は、次のことを試してください。

var arr = [
    { key: 'alz', value: '15a' },
    { key: 'aly', value: '16b' },
    { key: 'alx', value: '17a' },
    { key: 'alw', value: '09c' }
]; 

次に、次のように順番にアクセスできます。arr[0].keyおよびarr[0].value。同様に、次のようにループ内の兄弟を見つけることができます。

for(var i = 0; i < arr.length; i++)
{
    var previous_key = (i > 0) ? arr[(i - 1)].key : false;
    var next_key = (i < (arr.length - 1)) ? arr[(i + 1)].key : false;
}
于 2012-12-29T21:23:58.157 に答える
1

あなたはこれを試すことができます

function sortObject(obj, order)
{
    var list=[], mapArr = [], sortedObj={};
    for(var x in obj) if(obj.hasOwnProperty(x)) list.push(x);
    for (var i=0, length = list.length; i < length; i++) {
        mapArr.push({ index: i, value: list[i].toLowerCase() });
    }
    mapArr.sort(function(a, b) {
        if(order && order.toLowerCase()==='desc')
            return a.value < b.value ? 1 : -1;
        else return a.value > b.value ? 1 : -1;
    });
    for(var i=0; i<mapArr.length;i++)
        sortedObj[mapArr[i].value]=obj[mapArr[i].value];
    return sortedObj;
}
// Call the function to sort the arr object
var sortedArr = sortObject(arr); // Ascending order A-Z
var sortedArr = sortObject(arr, 'desc'); // Descending order Z-A

デモ

objectこれは新しいものを返し、オリジナルobjectは変更されないままになることを忘れないでください。

于 2012-12-29T22:18:20.770 に答える
1

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、プロトタイプとしてではなくを使用することを選択しました。しかし、そのようにする必要はありませんでした。これは、関数の代わりにプロパティを使用して、キーを列挙する関数、または内部オブジェクトを返す関数を提供することである可能性があります。Arrayfor (key in myObj)Array.length.length()each.object()

オブジェクトにアイテムを自分で追加しないことを覚えておく必要があるため、これは少し厄介かもしれません。つまり、myObj[key] = 'value';そうすると、indexは更新されません。また、物事の順序を並べ替えたり、特定の位置に挿入したり、位置ごとに削除したりする方法も提供していません。ただし、私のオブジェクトのアイデアが役立つと思われる場合は、そのようなものを追加する方法を理解できると確信しています。

新しいバージョンのEcmaScriptを使用すると、真のプロパティを追加して、それらを列挙できないようにすることができます。これにより、新しいオブジェクトが、私が想像している理想的なOrderedObjectのようにシームレスかつスムーズに動作できるようになります。

于 2012-12-29T22:48:28.257 に答える