所以我现在已经学习了两个月的javascript,并且我正在做一些入门课程,并且陷入了这个问题。我知道我需要一个循环。但我完全迷失了,似乎在任何地方都没有可比的问题可供学习。问题是://给出一个字符串,编写一个程序来计算该字符串中使用了多少种颜色。为了应对挑战,我们假设所有可用的颜色是:蓝色,绿色,灰色,红色,黑色和紫色。
这是我到目前为止的代码
//declaring values and user input
const colors = ["blue", "green", "gray", "red", "black", "purple"];
const sillySentence = prompt("Tell me a colorful Rhyme: ");
//for loop to solve the problem
//start output
console.log("You Listed " + x + " colors in your rhyme.")
答案 0 :(得分:1)
如果for循环不是必需条件,那么您可以采用另一种方法而不使用它。如果颜色数组的元素只有字母,则可以使用match()返回匹配的数组,为了构建正则表达式,我们将颜色数组转换为字符串并将,
替换为|
,这意味着正则表达式中的或,因此结果类似于 / blue | green | gray / ,然后我们计算匹配的长度:
const colors = ["blue", "green", "gray", "red", "black", "purple"];
const sillySentence = prompt("Text: ");
var r = new RegExp(colors.toString().replace(/,/g, "|"), "g");
var found = (sillySentence.match(r) > 0) ? sillySentence.match(r).length : 0;
console.log(found);
如果我们在颜色字符串中包含,
,则此示例将不起作用。
答案 1 :(得分:1)
这是一个使用正则表达式的版本。此代码仅接受颜色作为单词,例如bluegreen
将不匹配任何内容。
编辑:现在仅考虑唯一的颜色。
const colors = ['blue', 'green', 'gray', 'red', 'black', 'purple'];
const sillySentence = prompt('Tell me a colorful Rhyme:');
const result = (sillySentence.match(
new RegExp('(\\b' + colors.join('|') + '\\b)', 'g'))
.filter((value, index, self) => self.indexOf(value) === index)
|| []).length;
console.log(result);
说明:
/\b(blue|green|red)\b/
的正则表达式,其基本含义是:蓝色,绿色和红色之间的单词(\b
是单词边界字符,从而阻止thisisthebluecolor
与{{ 1}})。Array.join
构建该正则表达式。String.match
根据该正则表达式测试输入字符串。Array.filter
删除重复项(请参阅this answer)blue
的基本含义是:如果正则表达式不匹配,则将|| []
的结果视为一个空数组(因此,String.match
(该结果的大小将返回0) )。答案 2 :(得分:0)
您可以使用以下内容:
or
最好遍历颜色的数量,因为它们少于押韵的单词数,并且只会计算独特的颜色。
答案 3 :(得分:0)
一个简单但效率低下的解决方案是:
然后,您遍历单词并尝试查找颜色。示例:
const colors = ["blue", "green", "gray", "red", "black", "purple"];
const sillySentence = prompt("Tell me a colorful Rhyme: ");
const colorCount = new Set();
const words = sillySentence.toLowerCase().split(/[\s,.:;]+/);
for (let i = 0; i < words.length; i++) {
const word = words[i];
if (colors.indexOf(word) >= 0) {
colorCount.add(word);
}
}
console.log(colorCount.size);
一种更有效的解决方案是填充Set并使用它来快速查找颜色:
const colors = ["blue", "green", "gray", "red", "black", "purple"];
const sillySentence = prompt("Tell me a colorful Rhyme: ");
const colorSet = new Set();
colors.forEach(color => colorSet.add(color));
const colorCount = new Set();
const words = sillySentence.toLowerCase().split(/[\s,.:;]+/);
for (let i = 0; i < words.length; i++) {
const word = words[i];
if (colorSet.has(word)) {
colorCount.add(word);
}
}
console.log(colorCount.size);
答案 4 :(得分:0)
这不是正确的答案,因为您要使用 forloop 。由于您是JS新手,我想分享另一种在JS中做事的方法。
const colors = ["blue", "green", "gray", "red", "black", "purple"];
const sillySentence = prompt("Tell me a colorful Rhyme: ");
let count = 0;
sillySentence.split(' ').find((color)=> {
if (colors.includes(color) !== -1) {
count += 1;
}
});
console.log("You Listed " + count + " colors in your rhyme.");
答案 5 :(得分:0)
您还可以只使用regular expression
组匹配(例如/(blue)/
)并简单地计算长度...这样,您就不必担心特殊字符,分割成单词等了。< / p>
这里是一个例子:
const colors = ["blue", "green", "gray", "red", "black", "purple"];
const rhyme = "I love blue, and red, but mostly blue!! and sometimes green! and red... NO gray!"
console.log(colors.reduce((r,c) => {
let matches = rhyme.match(new RegExp(`(${c})`, 'gi'))
return matches ? Object.assign(r, { [c]: matches.length }) : r
},{}))
注意:我将整个东西都包裹在reduce
中,以便可以返回带有计数等的对象,但是我确定您能得到图片。
答案 6 :(得分:-1)
获取提示的值并将其拆分为一个数组,然后对该数组进行迭代,并针对该数组中的每个值查看colors数组中是否存在相同的元素,如果存在,则将x的值增加1 < / p>
const colors = ["blue", "green", "gray", "red", "black", "purple"];
const sillySentence = prompt("Tell me a colorful Rhyme: ");
let x = 0;
sillySentence.split(' ').forEach(function(item) {
if (colors.indexOf(item) !== -1) {
x += 1;
}
});
console.log("You Listed " + x + " colors in your rhyme.")
注意:该程序不会处理提示值中的唯一颜色。例如,如果任何颜色出现两次,它将被视为2