获取字符串中第n个出现的索引

时间:2018-12-07 12:44:38

标签: javascript

我正在尝试编写一个函数,该函数从字符串中返回特定字符的特定位置的索引。但是,我只能使它成功返回第一个或第二个索引。我的功能如下:

function getIndex(str,char,n) {
    return str.indexOf(char, str.indexOf(char) + n-1);
}

输入这些测试仅适用于前2个:

getIndex('https://www.example.example2.co.uk','.',2) // successfully returns 19
getIndex('https://www.example.example2.co.uk','.',1) // successfully returns 11
getIndex('https://www.example.example2.co.uk','.',3) // unsuccessfully returns 19

有人对这在两个以上实例中的工作方式有任何想法吗?我如何使用它的一个示例是获得以下信息:

var str = 'https://www.example.example2.co.uk';
str.substring(31); // returns .uk
str.substring(28, 31); // returns .co

感谢您的帮助。

6 个答案:

答案 0 :(得分:2)

在您的代码中,您没有指定第n次出现

str.indexOf(char, str.indexOf(char) + n-1);

在这里,您尝试跳过str.indexOf(char) + n-1个字符并继续搜索 试试这个功能

function getIndex(str,char,n) {
    return str.split('')
            .map((ch,index)=>ch===char?index:-1)
            .filter(in=>in!=-1)[n-1];
}
  • 说的字符串是Hello,您正在寻找第二个l

  • 将字符串拆分为字符[H,e,l,l,0]

  • 如果要查找的字符,则将它们映射到索引 [-1,-1,2,3,-1]

  • 过滤所有-1 [2,3]

  • 使用n-1(即3)获取第二个索引

答案 1 :(得分:2)

您可以使用splitslicejoin来满足您的要求。

逻辑

首先用split char字符串,然后使用slice合并拆分值,最多出现nth个。然后只需加入char。答案是length

在下面检查。

function getIndex(str, char, n) {
  return str.split(char).slice(0, n).join(char).length;
}

console.log(getIndex('https://www.example.example2.co.uk', '.', 2)) // returns 19
console.log(getIndex('https://www.example.example2.co.uk', '.', 1)) // returns 11
console.log(getIndex('https://www.example.example2.co.uk', '.', 3)) // returns 28

答案 2 :(得分:2)

const search = '.';
const indexOfAll = (arr, val) => arr.reduce((acc, curr, i) => (curr === val ? [...acc, i] : acc), []);

indexOfAll(Array.from('https://www.example.example2.co.uk'), search);
=> [ 11, 19, 28, 31 ]

答案 3 :(得分:2)

function findIndex(str, searchCharacter, n){
    var length = str.length, i= -1;
    while(n-- && i++<length ){
        i= str.indexOf(searchCharacter, i);
        if (i < 0) break;
    }
    return i;
}     

var index = findIndex('https://www.example.example2.co.uk','.',3);
console.log(index);
////
//  28
////

答案 4 :(得分:1)

这是最快的解决方案

function getIndex(str, character, n) {
    return str.split(character, n).join(character).length;
}

var v1 = getIndex("https://www.example.example2.co.uk", ".", 1);
var v2 = getIndex("https://www.example.example2.co.uk", ".", 2);
var v3 = getIndex("https://www.example.example2.co.uk", ".", 3);
var v4 = getIndex("https://www.example.example2.co.uk", ".", 4);
var v5 = getIndex("https://www.example.example2.co.uk", ".", 5);

console.log(v1, v2, v3, v4, v5);

答案 5 :(得分:1)

您还可以使用正则表达式exec方法:

function getIndex(str, find, occ) {
  var regex = new RegExp(`\\${find}`, 'g');
  let arr, count = 0;
  while ((arr = regex.exec(str)) !== null) {
    if (++count == occ) return regex.lastIndex - 1; 
  }
}

const a = getIndex('https://www.example.example2.co.uk','.',2);
const b = getIndex('https://www.example.example2.co.uk','.',1);
const c = getIndex('https://www.example.example2.co.uk','.',3);

console.log(a, b, c);