在JavaScript中,我需要一种有效的方法来访问具有以下形式的数组中的文档:
[
{
a : '1',
b : '2',
c : '3'
},
{
a : '4',
b : '5',
c : '6'
},
{...},
{...}
]
因此,所有文档都具有相同的密钥。如果我有a
的值(例如a = 4
),有没有办法从数组中检索a = 4
的文档而不循环遍历数组中的所有元素并执行检查?
答案 0 :(得分: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);
}

答案 1 :(得分:0)
var document = arr.filter(function(element) {
return element.a === '4';
}, arr)[0];
console.log(document);
答案 2 :(得分:0)
也许您应该阅读binary search algorithm。互联网上有许多JS实现。