如何find数组中所有元素的索引?
我正在尝试在JavaScript数组中find元素的所有实例(例如“Nano”)的索引。
var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];
我试过jQuery.inArray ,或类似的.indexOf() ,但它只给了元素的最后一个实例的索引,即在这种情况下,5。
我如何得到它的所有实例?
.indexOf()
方法有一个可选的第二个参数,它指定开始search的索引,所以你可以在循环中调用它来查找特定值的所有实例:
function getAllIndexes(arr, val) { var indexes = [], i = -1; while ((i = arr.indexOf(val, i+1)) != -1){ indexes.push(i); } return indexes; } var indexes = getAllIndexes(Cars, "Nano");
你真的不清楚你想如何使用索引,所以我的函数返回它们作为一个数组(或返回一个空的数组,如果没有find值),但你可以做别的索引值在循环内。
更新:根据VisioN的评论,一个简单的for循环将更有效地完成相同的工作,而且更容易理解,因此更容易维护:
function getAllIndexes(arr, val) { var indexes = [], i; for(i = 0; i < arr.length; i++) if (arr[i] === val) indexes.push(i); return indexes; }
另一种替代scheme是使用Array.prototype.reduce()
:
["Nano","Volvo","BMW","Nano","VW","Nano"].reduce(function(a, e, i) { if (e === 'Nano') a.push(i); return a; }, []); // [0, 3, 5]
注意:检查浏览器是否兼容 reduce
方法,如果需要使用polyfill 。
另一种使用Array.prototype.map()和Array.prototype.filter()的方法 :
var indices = array.map((e, i) => e === value ? i : '').filter(String)
用JQuery: FIDDLE看一下控制台日志
var Cars=["Nano","Volvo","BMW","Nano","VW","Nano"]; function getCarsPosition(carsTab, carName){ var t = []; $.each(carsTab , function(index, val) { if(val === carName){ t.push(index) } }); console.log(t) return t; } getCarsPosition(Cars, "Nano");
findIndex
只检索匹配callback输出的第一个索引。 您可以通过扩展Array实现自己的findIndexes
,然后将您的数组转换为新的结构。
class EnhancedArray extends Array { findIndexes(where) { return this.reduce((a, e, i) => (where(e, i) ? a.concat(i) : a), []); } } /*----Working with simple data structure (array of numbers) ---*/ //existing array let myArray = [1, 3, 5, 5, 4, 5]; //cast it : myArray = new EnhancedArray(...myArray); //run console.log( myArray.findIndexes((e) => e===5) ) /*----Working with Array of complex items structure-*/ let arr = [{name: 'Ahmed'}, {name: 'Rami'}, {name: 'Abdennour'}]; arr= new EnhancedArray(...arr); console.log( arr.findIndexes((o) => o.name.startsWith('A')) )
平原JS
var Cars=["Nano","Volvo","BMW","Nano","VW","Nano"]; for (var i = 0; i < Cars.length; i++) { console.log("Value: " + Cars[i] + ", Index: " + i); }