[英]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.