# String.prototype.indexesOf()

**URL:** <https://es.discourse.group/t/string-prototype-indexesof/1190>\
**Category:** 💡 Ideas\
**Created:** [February 7, 2022, 8:19pm UTC](https://es.discourse.group/t/string-prototype-indexesof/1190 "2022-02-07T20:19:44Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![TheAlphaReturns](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/thealphareturns/32/1218_2.png) [@TheAlphaReturns](https://es.discourse.group/u/TheAlphaReturns)\
**Post date:** [February 7, 2022, 8:19pm UTC](https://es.discourse.group/t/string-prototype-indexesof/1190/1 "2022-02-07T20:19:44Z")

</div>

Would work like

```javascript
String.prototype.indexesOf = function(char) {
    return [...this.matchAll(new RegExp(char, 'gi'))].map(a => a.index) // Returns array of indexes
}

```

It's easy enough to do yourself. Would like to see this added.

---

<div class="post-metadata">

**Author:** ![ljharb](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/ljharb/32/8_2.png) [@ljharb](https://es.discourse.group/u/ljharb)\
**Post date:** [February 7, 2022, 9:03pm UTC](https://es.discourse.group/t/string-prototype-indexesof/1190/2 "2022-02-07T21:03:56Z")

</div>

That particularly implementation would fail on any char that required escaping in a regex. What you want is something a bit different.

Either way tho, what's the use case? Why would you need all the matching indexes?

---

<div class="post-metadata">

**Author:** ![TheAlphaReturns](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/thealphareturns/32/1218_2.png) [@TheAlphaReturns](https://es.discourse.group/u/TheAlphaReturns)\
**Post date:** [March 11, 2022, 5:01am UTC](https://es.discourse.group/t/string-prototype-indexesof/1190/3 "2022-03-11T05:01:18Z")

</div>

e.g. remove all of character x of a string would be like

```javascript
let str = 'banana'

// remove every n
let ns = string.indexesOf('n');
for (var i = 0; i < ns.length; i++) {
    str = str.substring(0, ns[i] - 1) + str.substring(ns[i], str.length);
}

console.log(str); // <-- baaa

```

---

<div class="post-metadata">

**Author:** ![ljharb](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/ljharb/32/8_2.png) [@ljharb](https://es.discourse.group/u/ljharb)\
**Post date:** [March 11, 2022, 5:54am UTC](https://es.discourse.group/t/string-prototype-indexesof/1190/4 "2022-03-11T05:54:50Z")

</div>

or `str.replaceAll('n', '')`?

---

<div class="post-metadata">

**Author:** ![senocular](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/senocular/32/642_2.png) [@senocular](https://es.discourse.group/u/senocular)\
**Post date:** [March 11, 2022, 11:08am UTC](https://es.discourse.group/t/string-prototype-indexesof/1190/5 "2022-03-11T11:08:11Z")

</div>

You could iterate through all indices using

```javascript
for (var i = -1; (i = string.indexOf('n', i + 1)) !== -1;) {
   // ...
}

```

---

<div class="post-metadata">

**Author:** ![Rudxain](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/rudxain/32/2272_2.png) [@Rudxain](https://es.discourse.group/u/Rudxain)\
**Post date:** [September 14, 2022, 11:00pm UTC](https://es.discourse.group/t/string-prototype-indexesof/1190/6 "2022-09-14T23:00:44Z")

</div>

I would really like a generic-type implementation named `keysOf`, that returns all keys of an `Object`, `Map`, or `Array` that match an arbitrary predicate:

```javascript
const isEven = x => typeof x == 'bigint' ?
    (x & 1n) == 0n :
    Number.isInteger(x) && x % 2 == 0;

const arr = [0, 1n, 2n, 3, 'hello'];
keysOf(arr, isEven); //['0', '2']

const map = new Map();
arr.forEach(x => map.set(x, x));
keysOf(map, isEven); //[0, 2n]

```

---

<div class="post-metadata">

**Author:** ![senocular](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/senocular/32/642_2.png) [@senocular](https://es.discourse.group/u/senocular)\
**Post date:** [September 15, 2022, 11:00am UTC](https://es.discourse.group/t/string-prototype-indexesof/1190/7 "2022-09-15T11:00:08Z")

</div>

This seems easy enough today with `keys()` + `filter()`. For arrays, maps, and sets [iterator helpers](https://github.com/tc39/proposal-iterator-helpers) smooths this out a bit since their `keys()` methods return iterators and not arrays (like you'd get with `Object.keys()`).

---

<div class="post-metadata">

**Author:** ![Rudxain](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/rudxain/32/2272_2.png) [@Rudxain](https://es.discourse.group/u/Rudxain)\
**Post date:** [September 17, 2022, 6:16am UTC](https://es.discourse.group/t/string-prototype-indexesof/1190/8 "2022-09-17T06:16:54Z")

</div>

I agree with that. Iterator helpers are a good idea for this, since generators can be potentially infinite, also because lazy evaluation is good for speed and memory use
