我正在使用JavaScript,我有两个这样的字符串:
var week1="1.345.7", // each digit refers to one day of the week
week2="123..6.";
现在我想返回一个从1到7的值,它指的是共同的天数。
在上一个例子中,我应该返回2,因为我们有两周都有周一和周三(1和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