#javascript #arrays
#javascript #массивы
Вопрос:
Цель этого «счетчика» — увидеть, сколько разных слов находится внутри строки «ToCount». Для этого он выполняет подсчет массива, а затем перебирает элементы, проверяя, есть ли они уже там, и если нет, добавляет их туда.
ToCountArr2 остается пустым после цикла, и отображается длина 0. Почему это происходит и что я могу с этим поделать?
Я запустил отладчик и увидел, что никакие элементы не добавляются во второй список, как будто ничего не добавлено внутри элемента управления «if», если i-й элемент первого массива уже находится внутри второго массива.
function counter(){
var ToCount = document.getElementById("demo").value; //the contents of a textbox
var ToCountArr1 = ToCount.split(" ");
var ToCountArr2 = new Array;
var i = 0;
var lengthToCountArr1 = ToCountArr1.length;
var wordToPush;
while (i < lengthToCountArr1){
if(ToCountArr2.includes(ToCountArr1[i] === false)) {
wordToPush = ToCountArr1[i];
ToCountArr2.push(wordToPush);
}
i = i 1;
}
alert(ToCountArr2.length);
}
Комментарии:
1. что вы подразумеваете под этим,
ToCountArr1[i] === false
?2.
if(ToCountArr2.includes(ToCountArr1[i]) === false)
3. Голосование за закрытие из-за опечатки
4. Да, это была опечатка. Спасибо
Ответ №1:
Проблема в этой строке if(ToCountArr2.includes(ToCountArr1[i] === false))
. Здесь фигурные скобки должны быть после ToCountArr1[i]
, где, поскольку эта строка ToCountArr1[i] === false)
проверяет, является ли это значение в ToCountArr1
true или false .
Эта строка
if(ToCountArr2.includes(ToCountArr1[i] === false))
будет оцениваться как
if(ToCountArr2.includes(true/false))
в зависимости от результата ToCountArr1[i] === false)
function counter() {
var ToCount = document.getElementById("demo").value; //the contents of a textbox
var ToCountArr1 = ToCount.split(" ");
var ToCountArr2 = new Array;
var i = 0;
var lengthToCountArr1 = ToCountArr1.length;
var wordToPush;
while (i < lengthToCountArr1) {
if (ToCountArr2.includes(ToCountArr1[i]) === false) {
wordToPush = ToCountArr1[i];
ToCountArr2.push(wordToPush);
}
i = i 1;
}
console.log(ToCountArr2.length);
}
counter()
<input type='text' id='demo' value='Test Values'>
Вы можете свести if (ToCountArr2.includes(ToCountArr1[i]) === false) {
к минимуму, заменив его на
if (!ToCountArr2.includes(ToCountArr1[i])) {
Ответ №2:
Ваша wordcount
функция должна использовать параметр, чтобы вы могли передать строку. Это означает, что вы можете использовать wordcount
функцию для любой строки, а не только для элемента «demo». Кроме того, это хорошее время, чтобы узнать о Map —
const wordcount = (str = "") =>
{ const result =
new Map
for (const s of str.split(/ /))
if (s === "")
continue
else if (result.has(s))
result.set(s, result.get(s) 1)
else
result.set(s, 1)
return Array.from(result.entries())
}
const prettyPrint = (value) =>
console.log(JSON.stringify(value))
<!-- pass this.value as the string for wordcount
-- wordcount returns a value that we could use elsewhere
-- prettyPrint displays the value to the console
-->
<input onkeyup="prettyPrint(wordcount(this.value))">
Запустите фрагмент кода и скопируйте / вставьте следующую строку в поле —
this is the captain speaking. is this the commander?
Вы увидите этот вывод —
[["this",2],["is",2],["the",2],["captain",1],["speaking.",1],["commander?",1]]
Ответ №3:
Вот рабочий пример. Я думаю, это поможет вам правильно. Здесь я использую indexOf для проверки существования значения в массиве.
function counter(){
var ToCount = "I am string just for text.";//document.getElementById("demo").value; //the contents of a textbox
var ToCountArr1 = ToCount.split(" ");
var ToCountArr2 = new Array;
var i = 0;
var lengthToCountArr1 = ToCountArr1.length;
var wordToPush;
while (i < lengthToCountArr1){
if( ToCountArr2.indexOf(ToCountArr1[i]) == -1 ) {
wordToPush = ToCountArr1[i];
ToCountArr2.push(wordToPush);
}
i = i 1;
}
alert(ToCountArr2.length);
}
counter();