在数组中搜索不同的值以匹配用户输入

时间:2018-08-27 17:50:49

标签: javascript arrays

所以我现在已经学习了两个月的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.")

7 个答案:

答案 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