我的array
包含多个相同值
["test234", "test9495", "test234", "test93992", "test234"]
这里我想得到数组中每个test234
的索引
为此,我尝试了Array.prototype.indexOf()
方法。但它只返回0
,但我希望它返回给我[0, 2, 4]
。
我该怎么做?
var array = ["test234", "test9495", "test234", "test93992", "test234"];
document.write(array.indexOf("test234"));
答案 0 :(得分:7)
只需将其设为for循环即可检查每个数组元素。
var array = ["test234", "test9495", "test234", "test93992", "test234"];
for (i=0;i<array.length;i++) {
if (array[i] == "test234") {
document.write(i + "<br>");
}
}
&#13;
答案 1 :(得分:2)
这种功能并不存在于内置,但它自己很容易制作。值得庆幸的是,indexOf
也可以接受起始索引作为第二个参数。
function indexOfAll(array, searchItem) {
var i = array.indexOf(searchItem),
indexes = [];
while (i !== -1) {
indexes.push(i);
i = array.indexOf(searchItem, ++i);
}
return indexes;
}
var array = ["test234", "test9495", "test234", "test93992", "test234"];
document.write(JSON.stringify(indexOfAll(array, "test234")));
答案 2 :(得分:1)
您可以使用Array#indexOf
的fromIndex
。
<强>的fromIndex 强>
开始搜索的索引。如果索引大于或等于数组的长度,则返回-1,这意味着将不搜索该数组。如果提供的索引值为负数,则将其作为数组末尾的偏移量。注意:如果提供的索引为负数,则仍会从前到后搜索数组。如果计算的索引小于0,则将搜索整个数组。默认值:0(搜索整个数组)。
非常适合与
indexOf()
一起使用,因为indexOf
如果找到索引0 ... n
则返回,如果不是-1
则返回:value ~value boolean -1 => 0 => false 0 => -1 => true 1 => -2 => true 2 => -3 => true and so on
var array = ["test234", "test9495", "test234", "test93992", "test234"],
result = [],
pos = array.indexOf('test234');
while (~pos) {
result.push(pos);
pos = array.indexOf('test234', pos + 1); // use old position incremented
} // ^^^^^^^
document.write('<pre> ' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
答案 3 :(得分:0)
您可以将indexOf与for循环一起使用以获取索引值0、2、4:
var array = ["test234", "test9495", "test234", "test93992", "test234"];
let newArr=[];
for (i=0;i<array.length;i++) {
if (array[i].indexOf("test234") >=0 ) {
newArr.push(i);
}
}
document.write(newArr);
答案 4 :(得分:0)
您可以使用reduce:
const indexesOf = (arr, item) =>
arr.reduce(
(acc, v, i) => (v === item && acc.push(i), acc),
[]);
所以:
const array = ["test234", "test9495", "test234", "test93992", "test234"];
console.log(indexesOf(array, "test234")); // [0, 2, 4]
另一种方法可能是使用iterator:
function* finder(array, item) {
let index = -1;
while ((index = array.indexOf(item, index + 1)) > -1) {
yield index;
}
return -1;
}
这使您可以灵活地以惰性方式进行搜索,只有在需要时才可以进行搜索:
let findTest234 = finder(array, "test234");
console.log(findTest234.next()) // {value: 0, done: false}
console.log(findTest234.next()) // {value: 2, done: false}
console.log(findTest234.next()) // {value: 4, done: false}
console.log(findTest234.next()) // {value: -1, done: true}
当然,您总是可以循环使用它(因为它是迭代器):
let indexes = finder(array, "test234");
for (let index of indexes) {
console.log(index);
}
并立即使用迭代器以生成数组:
let indexes = [...finder(array, "test234")];
console.log(indexes); // [0, 2, 4]
希望有帮助。
答案 5 :(得分:0)
这不是最好的答案,但我想尝试一种递归方法:
var indexOfFull = (array, key, startIndex = 0) => {
let result = [];
//Control errors
if(!key) return result;
if(!array) return result;
if(array.length <= startIndex) return result;
//Search the KEY in array from the startIndex position
let index = array.indexOf(key, startIndex);
//If not found any index return []
if(index < 0) return result;
//If it finds a key, insert its position in the result array
result.push(index);
//Recursive call updating the value of startIndex
result = result.concat(indexOfFull(array, key, ++index));
//Return array with found indexes
return result;
}
const array = ["test234", "test9495", "test234", "test93992", "test234"];
console.log(indexOfFull(array, "test234"));
//Result => [0, 2, 4]