String.match.length返回数组。期望一个整数值。

时间:2016-04-03 18:31:39

标签: javascript regex string

我正在尝试编写一个函数,用于计算字母表中字母与字符串中字母的匹配。然后我将每个字母的计数存储到一个关联数组中。

我的问题是string.match(regExpression) || [].length正在返回一个数组。我的期望是它会返回一个与匹配长度相匹配的整数值。我知道string.prototype.match()方法返回一个数组,但我的理解(基于方法的形式描述)是Sting.length返回一个数字。

我做错了什么?

    function countLetters(string) {
    //create array with letters of alphabet
    var alphabet = "abcdefghijklmnopqrstuvwxyz".split("");
    var counts = []; 

  for (i = 0; i < alphabet.length; i++) {
    var regExpression = new RegExp(alphabet[i], "g"); 
    counts[alphabet[i]] = string.match(regExpression) || [].length
  }
  return counts; 
}

3 个答案:

答案 0 :(得分:2)

我意识到自己的错误。行string.match(regExpression) || [].length行为意外,因为我在调用length方法之前缺少匹配方法和逻辑运算符周围的括号。我正在返回数组或空数组的长度。

我还将counts更改为对象。

这是固定功能:

function countLetters(string) {
    //declare array with letters of alphabet
    var alphabet = "abcdefghijklmnopqrstuvwxyz".split("");
    //declare object which will store our counts
    var counts = {}; 

  //iterate through alphabet array, find matches, and assign count of matches to counts object
  for (i = 0; i < alphabet.length; i++) {
    var regExpression = new RegExp(alphabet[i], "g"); 
    counts[alphabet[i]] = (string.match(regExpression) || []).length
  }
  return counts; 
}

答案 1 :(得分:0)

你没有做错任何事,但是你期望错误的值,在这种情况下,当string.match是正确的时候,它将返回一个正确行为的数组。

  

此方法用于在将字符串与正则表达式匹配时检索匹配项,以及在数组中返回的匹配项

答案 2 :(得分:0)

我正在投票给OP自己的答案,因为他已经发现了我要指出的两个问题,即缺少括号和错误的数据类型。然而,因为我已经编写了代码,我还是会发布的。

var data = 'However beautiful the strategy, you should occasionally look at the results.'; //Winston Churchill 

// returns an array
function method_A(phrase) {
  var o = [], r;
  'abcdefghijklmnopqrstuvwxyz'.split('').forEach(function(s, i) {
    r = new RegExp(s, 'gi');
    o[i] = (phrase.match(r) || []).length;
  });
  return o;
}

// returns an object
function method_B(phrase) {
  var o = {}, r;
  'abcdefghijklmnopqrstuvwxyz'.split('').forEach(function(s, i) {
    r = new RegExp(s, 'gi');
    o[s] = (phrase.match(r) || []).length;
  });
  return o;
}

stdout.innerHTML = (
  'input:  ' + data + '\n' +
  'method_A: ' + JSON.stringify(method_A(data), false, '') + '\n' +
  'method_B: \n' + JSON.stringify(method_B(data), false, ' ')
);
<xmp id="stdout"></xmp>