Javascript 高效地查找数组中对象的索引
我试图在数组中查找对象的索引。我知道有一种方法可以使用underline.js实现这一点,但我正试图找到一种没有underline.js的有效方法。以下是我所拥有的:Javascript 高效地查找数组中对象的索引,javascript,jquery,json,Javascript,Jquery,Json,我试图在数组中查找对象的索引。我知道有一种方法可以使用underline.js实现这一点,但我正试图找到一种没有underline.js的有效方法。以下是我所拥有的: var arrayOfObjs = [{ "ob1": "test1" }, { "ob2": "test1" }, { "ob1": "test3" }]; function FindIndex(key) { var rx = /\{.*?\}/; // regex: finds stri
var arrayOfObjs = [{
"ob1": "test1"
}, {
"ob2": "test1"
}, {
"ob1": "test3"
}];
function FindIndex(key) {
var rx = /\{.*?\}/; // regex: finds string that starts with { and ends with }
var arr = []; // creates new array
var str = JSON.stringify(arrayOfObjs); // turns array of objects into a string
for (i = 0; i < arrayOfObjs.length; i++) { // loops through array of objects
arr.push(str.match(rx)[0]); // pushes matched string into new array
str = str.replace(rx, ''); // removes matched string from str
}
var Index = arr.indexOf(JSON.stringify(key)); // stringfy key and finds index of key in the new array
alert(Index);
}
FindIndex({"ob2": "test1"});
var arrayOfObjs=[{
“ob1”:“test1”
}, {
“ob2”:“test1”
}, {
“ob1”:“test3”
}];
函数FindIndex(键){
var rx=/\{.*?\}/;///regex:查找以{开头并以}结尾的字符串
var arr=[];//创建新数组
var str=JSON.stringify(arrayOfObjs);//将对象数组转换为字符串
对于(i=0;i
这个办法行得通,但恐怕效率不高。有其他选择吗?对于定制方法的替代方案,您可以这样做:
var arrayOfObjs = [{
"ob1": "test1"
}, {
"ob2": "test1"
}, {
"ob1": "test3"
}];
_.findIndex(arrayOfObjs, {"ob2": "test1"}); // => 1
一种方法是使用查看“过滤器”中的每个键在对象中是否具有匹配的正确值
every
确保循环在发现不匹配或缺失的值时立即停止
函数日志(msg){
document.querySelector('pre')。innerHTML+=msg+'\n';
}
var arr=[
{
a:1
},
{
b:2
},
{
c:3,
d:4
},
{
a:1//将永远不会达到此值,因为它会找到第一个匹配项
}
];
函数getIndex(过滤器){
var keys=Object.keys(过滤器);
对于(变量i=0,len=arr.length;i
因为在两个不同对象上测试相等性总是返回false,所以可以先测试键,然后测试值
使用reduce:
var arrayOfObjs=[{
“ob1”:“test1”
}, {
“ob2”:“测试1”,k2:2
}, {
“ob1”:“test3”
}];
功能getI(obj、arr){
const checkK=对象键(obj);
返回arr.reduce((ac,x,i)=>{
if(检查k.every(z=>x[z]&&obj[z]==x[z]))
交流推力(i);
返回ac;
},[])
}
write('result is:'+getI({ob2:'test1',k2:2},arrayOfObjs))
一个带有访问示例的哈希表
var arrayOfObjs=[{“obj1”:“test1”},{“obj2”:“test1”},{“obj1”:“test3”}],
散列={};
arrayOfObjs.forEach(函数(a,i){
Object.keys(a).forEach(函数(k){
hash[k]=hash[k]|{};
散列[k][a[k]]=i;
});
});
write(“”+JSON.stringify(hash['obj2']['test1'],0,4)+“”);
write(“”+JSON.stringify(散列,0,4)+“”)代码>这里有一种方法可以做到这一点,有点可靠,有点效率,使用some()
并在对象不匹配时立即停止,等等
var arrayOfObjs=[{
“ob1”:“test1”
}, {
“ob2”:“test1”
}, {
“ob1”:“test3”
}];
函数FindIndex(键){
var指数=-1;
arrayOfObjs.some(功能(项目一){
var result=Object.keys(key).some(function(oKey){
返回(项目中的oKey和项目[oKey]==键[oKey]);
});
如果(结果)指数=i;
返回结果;
});
收益指数;
}
var index=FindIndex({“ob2”:“test1”});
document.body.innerHTML=“{\'ob2\”:\“test1\”}”位于索引:“+index代码>在旧浏览器中不起作用,但它是为这个特定目的而设计的
var arrayOfObjs=[{
“ob1”:“test1”
}, {
“ob2”:“test1”
}, {
“ob1”:“test3”
}];
函数FindIndex(键){
返回arrayOfObjs.findIndex(
obj=>Object.keys(key).every(name=>key[name]==obj[name])
);
}
警报(FindIndex({“ob2”:“test1”}));//1
您需要它一次还是多次?可以,但效率不会更高,仍然是JavaScription如果比较字符串化的对象就足够了,您至少可以删除所有正则表达式内容,然后迭代->@Anthony如果您能够做到这一点,这听起来是个更好的主意。如果您需要经常查找这些对象并获取它们的索引(键),哈希表将是一个很好的解决方案。哈希表也非常容易用JavaScript编写,因为JavaScript中的所有内容基本上都是基于哈希表构建的already@Anthony另外,作为一个补充,当谈到速度效率时,总是尽量避免JSON.stringify()
;该方法速度惊人地慢。这有助于他们在arrayOfObjs
中获取匹配对象的索引吗?@MikeC,现在--现在。请注意,您依赖于对象的顺序,实际上只有一个属性。在RL中,我将使用一个属性顺序固定的数组。或者另一种方法这对于查找来说肯定比任何其他方法都要快,而且是迄今为止最有效的方法,我想我一开始误读了它,因为在数组上存储外部迭代的索引时,对象的顺序不会有问题。如果您说,你的意思是它可能不适用于所有情况吗?@Anthony-它适用于值为基本值的所有情况,也可能适用于其他值,但可能不适用于值为函数、原型或其他对象等的情况。将对象与任何类型的数据进行比较可能很复杂,这是大多数“常规”的快速修复方法对象。只是好奇:是否有理由使用arrayOfObjs.some
并分配索引,而不是对执行循环并立即返回索引?第一个some()
在找到匹配对象后立即停止,第二个som