Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 高效地查找数组中对象的索引_Javascript_Jquery_Json - Fatal编程技术网

Javascript 高效地查找数组中对象的索引

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

我试图在数组中查找对象的索引。我知道有一种方法可以使用underline.js实现这一点,但我正试图找到一种没有underline.js的有效方法。以下是我所拥有的:

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