indexOf():有更好的方法来实现它吗?

时间:2016-06-21 10:56:50

标签: javascript arrays indexof

修改

谢谢你们,我为在我的问题中没有更具体而道歉。 编写此代码是为了检查第二个字符串中的字符是否在第一个字符串中。如果是这样,它将返回true,否则为false。

所以我的代码有效,我知道的很多,但我很肯定有一个更好的方法来实现它。

请记住,这是来自Freecodecamp的Javascript树的编码挑战。

这是我的代码:

function mutation(arr) {

  var stringOne = arr[0].toLowerCase();
  var stringTwo = arr[1].toLowerCase().split("");
  var i = 0;
  var truthyFalsy = true;

  while (i < arr[1].length && truthyFalsy) {

    truthyFalsy = stringOne.indexOf(stringTwo[i]) > -1;
    i++

  }
  console.log(truthyFalsy);
}




mutation(["hello", "hey"]);
//mutation(["hello", "yep"]);

这是一个更好的方法来做到这一点。我最近了解了map函数,但不知道如何使用它来实现它,并且最近刚刚学习了一个Array.prototype.every()函数,我将在今晚阅读。

连连呢?思考?

1 个答案:

答案 0 :(得分:1)

问题很模糊。但是我从代码中理解的是你需要检查两个字符串之间的字符串匹配。

由于你知道它的两个字符串,我只是将它们作为两个参数传递。另外我将while更改为for语句并添加break / continue以避免使用变量get和set。

请注意,在最坏的情况下它几乎相同,但在最好的情况下它的半计算时间。

mutation bestCase 14.84499999999997
mutation worstCase 7.694999999999993
bestCase: 5.595000000000027
worstCase: 7.199999999999989

// your function (to check performance difference)
function mutation(arr) {

  var stringOne = arr[0].toLowerCase();
  var stringTwo = arr[1].toLowerCase().split("");
  var i = 0;
  var truthyFalsy = true;

  while (i < arr[1].length && truthyFalsy) {

    truthyFalsy = stringOne.indexOf(stringTwo[i]) > -1;
    i++

  }
  return truthyFalsy;
}



function hasMatch(base, check) {
  var strOne = base.toLowerCase();
  var strTwo = check.toLowerCase().split("");

  var truthyFalsy = false;

  // define both variables (i and l) before the loop condition in order to avoid getting the length property of the string multiple times.
  for (var i = 0, l = strTwo.length; i < l; i++) {
    var hasChar = strOne.indexOf(strTwo[i]) > -1;
    if (hasChar) {
      //if has Char, set true and break;
      truthyFalsy = true;
      break;
    }
  }
  return truthyFalsy;
}

var baseCase = "hello";
var bestCaseStr = "hey";
var worstCaseStr = "yap";

//bestCase find match in first iteration
var bestCase = hasMatch("hello", bestCaseStr);
console.log(bestCase);

//worstCase loop over all of them.
var worstCase = hasMatch("hello", worstCaseStr);
console.log(worstCase);

// on your function
console.log('mutation bestCase', checkPerf(mutation, [baseCase, bestCaseStr]));

console.log('mutation worstCase', checkPerf(mutation, [baseCase, worstCaseStr]));

// simple performance check
console.log('bestCase:', checkPerf(hasMatch, baseCase, bestCaseStr));

console.log('worstCase:', checkPerf(hasMatch, baseCase, worstCaseStr));

function checkPerf(fn) {
  var t1 = performance.now();
  for (var i = 0; i < 10000; i++) {
    fn(arguments[1], arguments[2]);
  }
  var t2 = performance.now();
  return t2 - t1;
}