获取数组中对象的索引,匹配条件

我有一个这样的数组:

[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...] 

我怎样才能得到匹配条件的对象的索引(不沿数组迭代)?

例如:对于prop2=="yutu" ,我想索引1

我看到.indexOf()方法,但认为它用于简单的数组,如: ["a1","a2",...]我也检查$.grep()但这返回我的对象​​,而不是索引.. 。

截至2016年,你应该使用Array.findIndex (一个ES2015 / ES6标准):

 a = [ {prop1:"abc",prop2:"qwe"}, {prop1:"bnmb",prop2:"yutu"}, {prop1:"zxvz",prop2:"qwrq"}]; index = a.findIndex(x => x.prop2=="yutu"); console.log(index); 

我怎样才能得到匹配条件的对象的索引(不沿数组迭代)?

你不能, 一定要遍历数组(至less一次)。

如果条件改变很多,那么你必须循环查看其中的物体,看它们是否符合条件。 但是,在具有ES5function的系统上(或者如果您安装垫片),该迭代可以做得相当简洁:

 var index; yourArray.some(function(entry, i) { if (entry.prop2 == "yutu") { index = i; return true; } }); 

这使用新的(ISH) Array#some函数 ,它循环通过数组中的条目,直到你给它的函数返回true。 我给它的函数保存了匹配条目的索引,然后返回true来停止迭代。

当然,也可以使用for循环。 这个其他答案涵盖了你的各种迭代选项。

但是,如果您总是要使用相同的属性进行查找,并且属性值是唯一的,则可以循环一次并创build一个映射它们的对象:

 var prop2map = {}; yourArray.forEach(function(entry) { prop2map[entry.prop2] = entry; }); 

(或者,也可以使用for循环或其他任何选项 。)

那么如果你需要findprop2 = "yutu"的条目,你可以这样做:

 var entry = prop2map["yutu"]; 

我称之为“交叉索引”数组。 当然,如果您删除或添加条目(或更改它们的prop2值),则还需要更新映射对象。

TJ Crowder说,无论如何都会有某种隐藏的迭代,这会变成:

 var index = _.findIndex(array, {prop2: 'yutu'}) 
 var index; yourArray.some(function (elem, i) { return elem.prop2 === 'yutu' ? (index = i, true) : false; }); 

遍历数组的所有元素。 它返回索引,如果条件不匹配,则返回true或false。

重要的是true的显式返回值(或布尔结果为true的值)。 单个赋值是不够的,因为可能的索引是0(Boolean(0)=== false),这不会导致错误,但会禁用迭代的中断。

编辑

甚至更短的版本:

 yourArray.some(function (elem, i) { return elem.prop2 === 'yutu' && ~(index = i); }); 

您可以按照以下方式使用Array.prototype.some() (如其他答案中所述):

https://jsfiddle.net/h1d69exj/2/

 function findIndexInData(data, property, value) { var result = -1; data.some(function (item, i) { if (item[property] === value) { result = i; return true; } }); return result; } var data = [{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"}] alert(findIndexInData(data, 'prop2', "yutu")); // shows index of 1 
 var CarId = 23; //Or other property name //x.VehicleId property to match in the object array var carIndex = CarsList.map(function (x) { return x.VehicleId; }).indexOf(CarId); 

你为什么不想完全迭代? 新的Array.prototype.forEach是伟大的为此目的!

如果需要,可以使用二叉search树通过单个方法调用查找。 这是一个整洁的实施BTree和红色黑色search树在JS – https://github.com/vadimg/js_bintrees – 但我不知道你是否可以在同一时间find索引。

一步使用Array.reduce() – 没有jQuery

 var items = [{id: 331}, {id: 220}, {id: 872}]; var searchIndexForId = 220; var index = items.reduce(function(searchIndex, item, index){ if(item.id === searchIndexForId) { console.log('found!'); searchIndex = index; } return searchIndex; }, null); 

如果没有find索引,将返回null

 var ar =[{"label":"home","path":"home"},{"label":"View","path":"/home/View/58a6d65a318bb99b0eef919d"},{"label":"Assessment Overview","path":"/assessmentOverview/:58a6d65a318bb99b0eef919c"}]; function functiontofindIndexByKeyValue(arry, key, value) { for (var i = 0; i < arry.length; i++) { if (arry[i][key] == value) { return i; } } return null; } var index = functiontofindIndexByKeyValue(ar, "label", "View"); console.log(index); 
 var list = [ {prop1:"abc",prop2:"qwe"}, {prop1:"bnmb",prop2:"yutu"}, {prop1:"zxvz",prop2:"qwrq"} ]; var findProp = p => { var index = -1; $.each(list, (i, o) => { if(o.prop2 == p) { index = i; return false; // break } }); return index; // -1 == not found, else == index } 

优化代码:

 var index; yourArray.some(function(entry, i) { index = i; return entry.prop2 == "yutu"; }); 

为什么他们都回复真假。

Georg已经提到ES6有这个Array.findIndex。 还有一些其他答案是使用Array.some方法的ES5的解决方法。

一个更优雅的方法可以

 var index; for(index = yourArray.length; index-- > 0 && yourArray[index].prop2 !== "yutu";); 

同时我想强调的是,Array.some可以用二进制或其他有效的search技术来实现。 所以,在某些浏览器中,它可能会更好地执行循环。