簡體   English   中英

通過附加鍵使Javascript數組元素可訪問

[英]Make Javascript array elements accessible by additional key

很多次(尤其是在MVC場景中),我不得不使用數組來存儲對象,但是我還必須通過存儲的對象的屬性來訪問對象。 然后,我可能會迭代數組,但是我猜(猜猜是因為我對Javascript性能的了解很少),對於成百上千個對象和數百次迭代而言,這已經很慢了。 然后,我建立一個像這樣的索引:

var arr = [];
var index = {};

var o1 = {id: 0, key: "A", data: "X"};
var o2 = {id: 1, key: "B", data: "Y"};

arr.push(o1);
arr.push(o2);
index[o1.key] = o1;
index[o2.key] = o2;

var lookupKey = "B";

// modify object
arr[1].data = "Z";

// get data for key "B" - alerts "Z"
alert(index[lookupKey].data);

http://jsfiddle.net/timvdh/WT53x/3/

當然,我必須建立和維護該索引...我想知道是否有更好的方法?

我想有一個包含“ SortedDictionaries”(。NET中此類泛型集合的名稱)的庫-我想知道的是。 但是,我也在使用專門的數組(例如,剔除的observableArray),我也需要一種索引該數組的方法。 或者我需要知道,完全不值得對索引進行操作。

聽起來您朝着正確的方向前進,但是您可以使用一些技巧來獲得所需的答案,而無需建立單獨的索引。

var arr = [];

arr.push({id: 0, key: "A", data: "X"});
arr.push({id: 1, key: "B", data: "Y"});

arr[1].data = 'Z';

var lookup = 'B';

現在,您可以在數組上使用filter方法*來以正確的查找值拉出對象。

var result = arr.filter(function(el) {
  return el.key === lookup;
});

請注意, results將是找到的所有匹配項的數組。 因此,如果數組中只有一個元素:

console.log(result[0].data) // Z

讓我們向數組添加另一個對象,然后重新運行過濾器:

arr.push({id: 2, key: "B", data: "E"});

並在結果上使用循環:

for (var i = 0, l = result.length; i < l; i++) {
  console.log(result[i].data); // Z and E
}

小提琴

最終,您可能希望將其封裝為如下所示的函數:

function findThings(prop, value) {
  return arr.filter(function(el) {
    return el[prop] === value;
  });
}

console.log(findThings('key', 'B')) // an array of two objects that you can loop over

*請注意,對於較舊的瀏覽器,您需要使用filter填充

我看到的最好的解決方案是對數組進行迭代。

ECMAScript 6可能會引入find()方法。 在此之前,您可能會創建一個簡單的功能,如下所示(未經測試):

function obj_find(arr, key, value) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i][key] == value) return arr[i];
    }

    return null;
}

我認為這不會降低您的應用程序運行速度,因為該函數會在找到值后立即返回。 但是您有成千上萬個要搜索的元素,您可能會添加一個緩存以加速該功能。

暫無
暫無

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

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