簡體   English   中英

通過在文檔內部數組中鍵入密鑰來訪問文檔的有效方法?

[英]Efficient way to access document by key in inside array of documents?

在JavaScript中,我需要一種有效的方式來訪問具有以下形式的數組中的文檔:

[
    { 
      a : '1',
      b : '2',
      c : '3'
    },
    { 
      a : '4',
      b : '5',
      c : '6'
    },
    {...},
    {...}
]

因此,所有文檔都具有相同的密鑰。 如果我對值a (例如a = 4 ),有一個方法來檢索其中文檔a = 4從陣列不通過所有的元素陣列中的循環和執行所述檢查?

僅使用您顯示的數據結構,如果沒有一些循環遍歷數組的代碼,就無法檢索鍵a為=== '4'的對象。 數組沒有權力在不循環的情況下在嵌套對象中查找內容。

可以為該數組建立​​一個單獨的索引,也可以將數據重新構造為另一種類型的數據結構,這將允許您在不循環的情況下檢索所需的項,但因為那里沒有結構化的數據。

例如,你可以循環陣列上一次和建立的所有值的索引a存在於陣列,使得與來自索引一個接入,則可以知道哪個數組元素包含的所希望的值在a 但是,您必須先建立該類型的索引,然后才能使用它。 如果這是一次訪問,那會救不了你任何時間,但如果你要尋找起來的價值觀a一遍又一遍,它可以節省大量的時間。 一次建立索引,然后多次使用以提高查找特定值的效率。


為了更有效地查找數組較大的數據,這是一種對數據進行一次索引然后在此之后多次使用該索引的方案。 這假定數據是字符串或具有明確的字符串轉換(您的示例適合):

 var data = [ { a : '1', b : '2', c : '3', d : '1'}, { a : '4', b : '5', c : '6', d : '1'}, { e : '3', a : '1', c : '5'}, ]; function ArrayIndex(data) { var index = {}; data.forEach(function(obj, i) { Object.keys(obj).forEach(function(key) { var combinedKeyVal = "_" + key + "_" + obj[key]; var slot = index[combinedKeyVal]; if (!slot) { slot = index[combinedKeyVal] = []; } // add this index to the slot array slot.push(i) }); }); this.find = function(key, val) { var combinedKeyVal = "_" + key + "_" + val; return index[combinedKeyVal] || []; } } var index = new ArrayIndex(data); var found = index.find('a', '4'); log(found); found = index.find('d', '1'); log(found); found = index.find('c', '5'); log(found); found = index.find('d', '2'); log(found); // display output in snippet function log(x) { var div = document.createElement("div"); div.innerHTML = JSON.stringify(x); document.body.appendChild(div); } 

您可以使用Array.prototype.filter

var document = arr.filter(function(element) {
    return element.a === '4';
}, arr)[0];

console.log(document);

也許您應該閱讀有關二進制搜索算法的信息 互聯網上有許多JS實現。

如果您只需要通過'a'鍵訪問數組中的對象,並且可以將數組重新構造為JSON對象,則可以執行以下操作:

var jsonObj = {
   '1': { b: '2', c: '3' },
   '4': { b: '5', c: '6'},
   ....
}

然后,您可以使用“ 1”鍵檢索對象,如下所示:

jsonObj['1']

(請注意,JSON中的數字作為鍵無效,因此您將無法使用jsonObj.1)

暫無
暫無

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

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