Array.push не является функцией с возвращаемым массивом

#javascript

#javascript

Вопрос:

У меня возникла проблема, когда я ввожу в свою текстовую область другой символ. Что метод .push не является ошибкой функции. Кажется, я не могу найти решение.

 updatestats(){
           //sample input
        let input = "aab";
        let collectionresult = [];
        for(let i=0;i < input.length;i  )
        {
            let char = input[i];
            collectionresult = this.checkuniqueness(collectionresult,char);
            
        }        
        console.log(collectionresult);
    }
    checkuniqueness(collection, character) {
        let update = false;
        for (let i = 0; i < collection.length; i  ) {
            if (collection[i].character === character) {
                collection = {
                    character: character,
                    number: collection[i].number   1
                }
                update = true;
            }
        }
        if (update === false) {
            collection.push({
                character: character,
                number: 1
            });

        }

        return collection;
    }
  

Комментарии:

1. Потому collection что это больше не массив: collection = { ... }

2. Если .push это не функция, то то, к чему вы ее применяете, не является массивом. Итак, посмотрите, что это такое .

Ответ №1:

В первой функции вы устанавливаете переменную коллекции в качестве массива, но во второй функции вы меняете тип переменной ‘collection’ на объект, но push() определяется только для массивов, поэтому это не может работать :

     collection = {
        character: character,
        number: collection[i].number   1
    }
  

Комментарии:

1. таким образом, вы имеете в виду, что он не обновляет существующий объект в массиве.

2. @johhny Он заменяет весь массив этим объектом. Вы имели в виду присвоение collection[i] , а не collection .

3. Но вы должны просто увеличить счетчик: collection[i].number ;

4. таким образом, тип массива может измениться на объект, даже если он объявлен как массив.

Ответ №2:

Как указывали другие, вы заменяете collections массив одним объектом, содержащим обновленный элемент для данного символа. Вы должны просто обновить этот элемент на месте, а не переназначать сам массив, заменив это назначение на:

 collections[i].number  ;
  

Вашу функцию также можно упростить, заменив цикл find() методом.

 checkuniqueness(collection, character) {
  let counter = collection.find(o => o.character == character);
  if (counter) {
    counter.number  ;
  } else {
    collection.push({
      character: character,
      number: 1
    });
  }

  return collection;
}