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