提问者:小点点

具有多个值的JavaScript indexOf方法


我有一个包含多个相同值的数组

["test234", "test9495", "test234", "test93992", "test234"]

这里我想获取数组中每个test234的索引

为此,我尝试了Array.原型. indexOf()方法。但它只返回我0,但我希望它返回我[0,2,4]

我该怎么做?

var array = ["test234", "test9495", "test234", "test93992", "test234"];
document.write(array.indexOf("test234"));

共3个答案

匿名用户

只需使其成为一个for循环来检查每个数组元素。

var array = ["test234", "test9495", "test234", "test93992", "test234"];

for (i=0;i<array.length;i++) {
  if (array[i] == "test234") {
    document.write(i + "<br>");
  }
}

匿名用户

这种函数不存在内置的,但自己制作会很容易。值得庆幸的是,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")));

匿名用户

您可以使用duce:

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]

另一种方法可能是使用迭代器:

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]

希望有帮助。