Почему второй массив остается пустым?

#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();