繁体   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