具有多个值的Javascript indexOf方法

时间:2016-04-14 18:54:32

标签: javascript arrays indexof

我的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"));

6 个答案:

答案 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;
&#13;
&#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#indexOffromIndex

  

<强>的fromIndex

     

开始搜索的索引。如果索引大于或等于数组的长度,则返回-1,这意味着将不搜索该数组。如果提供的索引值为负数,则将其作为数组末尾的偏移量。注意:如果提供的索引为负数,则仍会从前到后搜索数组。如果计算的索引小于0,则将搜索整个数组。默认值:0(搜索整个数组)。

~bitwise not operator

  

非常适合与indexOf()一起使用,因为indexOf如果找到索引0 ... n则返回,如果不是-1则返回:

value  ~value   boolean
-1  =>   0  =>  false
 0  =>  -1  =>  true
 1  =>  -2  =>  true
 2  =>  -3  =>  true
 and so on 

&#13;
&#13;
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;
&#13;
&#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]