Javascript 通过文档内部数组中的键访问文档的有效方法?

Javascript 通过文档内部数组中的键访问文档的有效方法?,javascript,arrays,performance,Javascript,Arrays,Performance,在JavaScript中,我需要一种高效的方法来访问具有以下形式的数组中的文档: [ { a : '1', b : '2', c : '3' }, { a : '4', b : '5', c : '6' }, {...}, {...} ] 因此,所有文档都具有相同的密钥。如果我有a(例如a=4)的值,是否有一种方法可以从数组中检索a=4的文档,而无需循环遍历数组中的所有元

在JavaScript中,我需要一种高效的方法来访问具有以下形式的数组中的文档:

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

因此,所有文档都具有相同的密钥。如果我有
a
(例如
a=4
)的值,是否有一种方法可以从数组中检索
a=4
的文档,而无需循环遍历数组中的所有元素并执行检查?

仅使用您显示的数据结构,如果没有在数组中循环的代码,则无法检索键
a
为===
'4'
的对象。数组没有任何能力在不循环的情况下在嵌套对象中查找内容

可以为该数组构建一个单独的索引,或者将数据重组为不同类型的数据结构,这样就可以在不循环的情况下检索所需的项,但不能像在那里构建数据那样

例如,您可以在数组上循环一次,并为数组中存在的
a
的所有值建立索引,以便通过该索引的一次访问,您可以知道哪些数组元素包含所需的
a
值。但是,在使用之前,您必须首先构建这种类型的索引。如果这是一次性访问,则不会节省任何时间,但如果要反复查找
a
的值,则可以节省大量时间。构建一次索引,然后多次使用它来提高查找特定值的效率


为了在数组较大时更有效地查找数据,这里提供了一种方案,可以对数据进行一次索引,然后多次使用该索引。这假设数据是字符串或具有非歧义字符串转换(您的示例适用):

var数据=[
{a:'1',b:'2',c:'3',d:'1'},
{a'4',b'5',c'6',d'1'},
{e:'3',a:'1',c:'5'},
];
函数数组索引(数据){
var指数={};
数据.forEach(函数(obj,i){
Object.keys(obj).forEach(函数(key){
var combinedKeyVal=“”+key+“”+obj[key];
var插槽=索引[combinedKeyVal];
如果(!插槽){
插槽=索引[combinedKeyVal]=[];
}
//将此索引添加到插槽阵列
插槽推送(i)
});
});
this.find=函数(键,val){
var combinedKeyVal=“”+key+“”+val;
返回索引[combinedKeyVal]| |[];
}
}
var指数=新的阵列指数(数据);
var found=index.find('a','4');
日志(已找到);
find=index.find('d','1');
日志(已找到);
find=index.find('c','5');
日志(已找到);
find=index.find('d','2');
日志(已找到);
//在代码段中显示输出
函数日志(x){
var div=document.createElement(“div”);
div.innerHTML=JSON.stringify(x);
文件.正文.附件(div);

}
仅使用您显示的数据结构,如果没有一些循环通过数组的代码,就无法检索键
a
为===
'4'
的对象。数组没有任何能力在不循环的情况下在嵌套对象中查找内容

可以为该数组构建一个单独的索引,或者将数据重组为不同类型的数据结构,这样就可以在不循环的情况下检索所需的项,但不能像在那里构建数据那样

例如,您可以在数组上循环一次,并为数组中存在的
a
的所有值建立索引,以便通过该索引的一次访问,您可以知道哪些数组元素包含所需的
a
值。但是,在使用之前,您必须首先构建这种类型的索引。如果这是一次性访问,则不会节省任何时间,但如果要反复查找
a
的值,则可以节省大量时间。构建一次索引,然后多次使用它来提高查找特定值的效率


为了在数组较大时更有效地查找数据,这里提供了一种方案,可以对数据进行一次索引,然后多次使用该索引。这假设数据是字符串或具有非歧义字符串转换(您的示例适用):

var数据=[
{a:'1',b:'2',c:'3',d:'1'},
{a'4',b'5',c'6',d'1'},
{e:'3',a:'1',c:'5'},
];
函数数组索引(数据){
var指数={};
数据.forEach(函数(obj,i){
Object.keys(obj).forEach(函数(key){
var combinedKeyVal=“”+key+“”+obj[key];
var插槽=索引[combinedKeyVal];
如果(!插槽){
插槽=索引[combinedKeyVal]=[];
}
//将此索引添加到插槽阵列
插槽推送(i)
});
});
this.find=函数(键,val){
var combinedKeyVal=“”+key+“”+val;
返回索引[combinedKeyVal]| |[];
}
}
var指数=新的阵列指数(数据);
var found=index.find('a','4');
日志(已找到);
find=index.find('d','1');
日志(已找到);
find=index.find('c','5');
日志(已找到);
find=index.find('d','2');
日志(已找到);
//在代码段中显示输出
函数日志(x){
var div=document.createElement(“div”);
div.innerHTML=JSON.stringify(x);
文件.正文.附件(div);
}
您可以使用

你可以使用


也许你应该读一下。互联网上有很多JS实现。

也许你应该阅读一下。Internet上有许多JS实现。

如果您只需要通过“a”键访问数组中的对象,并且可以将数组重新构造为JSON对象,则可以执行以下操作:

var jsonObj = {
   '1': { b: '2', c: '3' },
   '4': { b: '5', c: '6'},
   ....
}
然后可以使用“1”键检索对象,如下所示:

jsonObj['1']
(请注意,JSON中作为键的数字无效,因此
jsonObj['1']