如何以这种方式比较两个字符串?

时间:2016-07-19 02:55:39

标签: javascript regex string

我正在使用JavaScript,我有两个这样的字符串:

var week1="1.345.7", // each digit refers to one day of the week
    week2="123..6.";

现在我想返回一个从1到7的值,它指的是共同的天数。

在上一个例子中,我应该返回2,因为我们有两周都有周一和周三(1和3)。

我如何实现上述目标?

3 个答案:

答案 0 :(得分:4)

每个字符都是.或其索引,因此您可以用一点来表示它。

"0b" + "1.345.7".replace(/./g, c=>c==='.'?0:1); // "0b1011101"
"0b" + "123..6.".replace(/./g, c=>c==='.'?0:1); // "0b1110010"

然后,您可以使用按位运算符AND &

  "0b1011101"
& "0b1110010";
// 0b1010000

最后,您只需要将其转换回字符串并计算1

的数量
0b1010000.toString(2).split('1').length-1; // 2

可能我不会这样做,只是为了好玩:)

事实上,为了减少内存浪费,您可以将数据存储为数字而不是字符串

0b1011101; //  93 - only needs 64 bits!
0b1110010; // 114 - only needs 64 bits!

并检索数据

0b1011101 >> 6 & 1; // 1 - 1st bit
0b1011101 >> 5 & 1; // 0 - 2nd bit
0b1011101 >> 4 & 1; // 1 - 3rd bit
0b1011101 >> 3 & 1; // 1 - 4th bit
0b1011101 >> 2 & 1; // 1 - 5th bit
0b1011101 >> 1 & 1; // 0 - 6th bit
0b1011101 >> 0 & 1; // 1 - 7th bit

答案 1 :(得分:1)

使用快速正则表达式从第一个字符串中获取数字列表,然后对其进行过滤以仅保留另一个中的数字,然后查看length中有多少数字。

(week1.match(/\d/g) || []) . filter(n => week2.includes(n)) . length

在"代码高尔夫"精神,你可以把它写成一个生成器,利用for...of循环字符串中字符的能力:

function *common(a, b) {
  for (c of a) if (c !== '.' && b.includes(c)) yield c;
}

console.log(...common(a, b))

答案 2 :(得分:0)

只是抛出另一个选项,如果你用一个空字符串参数拆分一个字符串,你会得到一个单字符串的数组。这使得它们易于迭代,但如果您定位支持ECMAscript 5.1(最着名的是IE 9+)的浏览器,则可以使用 reduce 功能。当您在要迭代并返回单个值的数组中传递时,它通常非常适合。这可能更简洁,但我认为按照这种方式更容易理解。



var week1="1.345.7";
var week2="123..6.";

function weekDaysInCommon(w1, w2) {
  //split to convert w1 to an array.
  //"1.345.7" becomes ["1", ".", "3", "4", "5", ".", "7"]
  w1 = w1.split('');
  //countCharactersAtSameIndex(w2) returns the function to use as the callback, with w2 accessible to it via closure
  //the second arg, 0, is the initial value.
  return w1.reduce(countCharactersAtSameIndex(w2), 0);
}

function countCharactersAtSameIndex(comparisonWeek) {
  comparisonWeek = comparisonWeek.split('');
  return function(total, day, index) {
    if(comparisonWeek[index] === day) {
      return total + 1;
    } else {
      return total;
    }
  }
}

document.write(weekDaysInCommon(week1, week2) + ' days in common');




进一步阅读: MDN有一个关于reduce函数的好文档 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce