Javascript 从文本体获取字符串的行号

Javascript 从文本体获取字符串的行号,javascript,string,character,substring,line-breaks,Javascript,String,Character,Substring,Line Breaks,假设我有一个有两行的文件,我在文件中得到了indexOfa子字符串。它返回子字符串所在的字符18。我怎样才能找到包含此信息的行 var file = [ 'var foo = "hello"', 'console.log(foo)', ].join('\n') var char = file.indexOf('console') // => 18 var line = lineOfChar(file, char) // => 2 实现这一点的一种可能方法是像使用以下方法一

假设我有一个有两行的文件,我在文件中得到了
indexOf
a子字符串。它返回子字符串所在的字符
18
。我怎样才能找到包含此信息的行

var file = [
  'var foo = "hello"',
  'console.log(foo)',
].join('\n')

var char = file.indexOf('console') // => 18
var line = lineOfChar(file, char) // => 2

实现这一点的一种可能方法是像使用以下方法一样查找字符串:

var index = file.indexOf('console'); // => 18
然后使用此索引生成包含该索引之前所有内容的子字符串:

var tempString = str.substring(0, index);
最后,我们计算
\n
的出现次数:

var lineNumber = tempString.split('\n').length;
// You should do - 1 if you want your 'first' line to be 0
函数行(文本,子字符串){
变量行=0,匹配字符=0;
对于(变量i=0;i

避免在字符串上重复两次,一次查找子字符串,另一次查找换行符。

计算
\n
的数量,直到达到行号为止。我不知道为什么这样做。我脑子里一定在想那个长度的索引。将编辑原始答案。什么是str引用?
var assert = require('assert')

var file = [
  'var alpha = "hello"',
  'var beta = "hello"',
  'var gamma = "hello"',
  'var delta = "hello"',
  'var episilon = "hello"'
].join('\n')

function getLine (body, charOrString) {
  if (!body) return false
  if (!charOrString) return false
  var char = (typeof charOrString === 'string') ? body.indexOf(charOrString) : charOrString
  var subBody = body.substring(0, char)
  if (subBody === '') return false
  var match = subBody.match(/\n/gi)
  if (match) return match.length + 1
  return 1
}

assert.equal(getLine(file, 'missing'), false)
assert.equal(getLine(file, 'alpha'), 1)
assert.equal(getLine(file, 'beta'), 2)
assert.equal(getLine(file, 'gamma'), 3)
assert.equal(getLine(file, 'delta'), 4)
assert.equal(getLine(file, 'episilon'), 5)
function lineOf(text, substring){
  var line = 0, matchedChars = 0;

  for (var i = 0; i < text.length; i++) {
    text[i] === substring[matchedChars] ? matchedChars++ : matchedChars = 0;

    if (matchedChars === substring.length){
        return line;                  
    }
    if (text[i] === '\n'){
        line++;
    }
  }

  return  -1;
}