[英]How to search for multiple index(es) of same values in javascript array
我有一个1维数组,如:
var abc = ['a','a','b','a','c']
现在我想找回'a'
所有索引,即0,1和3。
有没有简单的解决方案?
PS
我知道IndexOf
或jQuery.inArray()
。 但他们只返回了第一个匹配元素的索引
您可以使用以下方法扩展基本Array
Object
:
Array.prototype.multiIndexOf = function (el) {
var idxs = [];
for (var i = this.length - 1; i >= 0; i--) {
if (this[i] === el) {
idxs.unshift(i);
}
}
return idxs;
};
然后操作
var abc = ['a','a','b','a','c'];
abc.multiIndexOf('a');
会给你结果:
[0, 1, 3]
Jsperf比较 unshift / push / push(逆序)
您可以使用与indexOf
结合的while循环,而不是使用for循环:
var array = [1, 2, 3, 4, 2, 8, 5],
value = 2,
i = -1,
indizes = [];
while((i = array.indexOf(value, i + 1)) !== -1) {
indizes.push(i);
}
这将返回[1, 4]
,当然可以与扩展Array
的原型相结合。
indexOf
的第二个参数指定在给定数组中开始搜索的位置。
AFAIK,没有Javascript或jQuery函数可以一步完成,你必须编写一个循环。
var indexes = [];
$.each(abc, function(i, val) {
if (val == "a") {
indexes.push(i);
}
}
这样做:
var abc = ['a','a','b','a','c'];
for (var i=0; i<abc.length; i++) {if(abc[i]=='a') {console.log(i)};}
您可以利用$ .map()在您传递的函数返回undefined
时不会在其结果数组中推送值的事实。
因此,你可以写:
var abc = ["a", "a", "b", "a", "c"];
var indices = $.map(abc, function(element, index) {
if (element == "a") {
return index;
}
});
你还在数组上使用reduce函数并将索引推送到累积数组,你需要从一个空数组开始,关于reduce的好处是它是异步的,并且时间执行比for循环更快,它也是数组上的本机函数,看下面,希望它有所帮助:
var arr = [0, 1, 2, 3, 7, 2, 3, 4, 7, 8, 9, 2, 3];
function indexesOf(num) {
var reduced = arr.reduce(function(acc, val, ind, arr){
if(val === num){
acc.push(ind);
}
return acc;
}, []);
return reduced;
}
indexesOf(2); //[2, 5, 11]
演示用于循环
var arr = ['a', 'a', 'b', 'a', 'c'];
var indexA = [];
for (var i = 0; i < arr.length; i++) {
if ("a" == arr[i]) indexA.push(i)
}
如果您的数组大小是固定的,那么您可以使用indexOf()
在数组中找到第一个匹配项。 使用找到的索引值作为indexOf()
起始点来查找其他匹配项。
var firstOccurance = [your_array].indexOf(2)
var secondOccurance = [your_array].indexOf(2, firstOccurance + 1)
您可以使用Array#reduce
with Array#concat
检查所需项目,获取索引或空数组。
var abc = ['a', 'a', 'b', 'a', 'c'], indices = abc.reduce((r, v, i) => r.concat(v === 'a' ? i : []), []); console.log(indices);
ES5
var abc = ['a', 'a', 'b', 'a', 'c'], indices = abc.reduce(function (r, v, i) { return r.concat(v === 'a' ? i : []); }, []); console.log(indices);
使用ES6语法,您可以使用forEach和三元运算符:
const abc = ['a','a','b','a','c']
let matchingIndexes = []
abc.forEach( (currentItem, index) => {
currentItem === 'a' ? matchingIndexes.push(index) : null
})
console.log(matchingIndexes) // [0, 1, 3]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.