簡體   English   中英

JavaScript 中關聯數組按鍵和按索引訪問的順序

[英]Order of the associative array in JavaScript by key and access by index

我有一個關聯數組,如:

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

我需要找到任何選定元素的上一個和下一個鍵。 比如說,對於鍵 'aly',它將是 'alz' 和 'alx'。 如果可能,我想通過索引而不是鍵來訪問數組。

目前,我使用包含鍵的單獨數組來執行此操作,例如

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

對象屬性的順序是undefined 您可以使用這種結構...

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

...雖然搜索具有給定鍵的元素(例如 'give me the element which key is 'alz' )並不像使用簡單對象那樣直接。 這就是為什么像你一樣使用它 - 提供一個單獨的數組來排序索引 - 是另一種常見的方法。 您可以將此數組附加到該對象,順便說一句:

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

這是一個對象,而不是一個數組,聽起來您並不真的希望這些字符串成為鍵。

一個漂亮的數組怎么樣?

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

如果您必須知道所有內容的順序,並且仍然使用鍵值,請嘗試以下操作:

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

然后您可以按如下方式依次訪問它們: arr[0].keyarr[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;
}

你可以試試這個

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將保持不變。

如何以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 一樣運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM