Сравнение положительных и отрицательных чисел в javascript

#javascript #arrays #algorithm

#javascript #массивы #алгоритм

Вопрос:

У меня есть функция Javascript, которая подсчитывает количество отсортированных чисел в заданном массиве. По какой-то причине это работает для всех положительных чисел, но когда массив содержит отрицательные числа, функция ведет себя так, как если бы отрицательные числа были положительными. Есть идеи о том, почему это происходит

 countUniqueValues = (a) => {
    if(a.length === 0){return 0;}
    
    let i = 0;
    let j = 1;

    while(a[j]){
        if(a[i] === a[j]){
            j  ;
        } 
        else if(a[i] !== a[j]){
            i  ;
            a[i] = a[j];
        }
    }
    return i 1;
}
 
 console.log(countUniqueValues([-2,-1,-1,0,1])); // return 2 and should return 4
 

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

1. a[i ]; ДА?….

2. Ну while(a[j]) , это остановится, когда он достигнет этого 0 . Это похоже на немедленную ошибку.

3. Если вы хотите выяснить, почему он возвращает 2, возьмите карандаш и бумагу и начните пошагово просматривать его. Или вы можете использовать отладчик вашего браузера.

4. Просто чтобы вы знали, это также не работает с некоторыми положительными наборами, например, я протестировал [2,4,5,6,5] .

5. i настраивается 1 и устанавливается a[1] равным самому себе. Тогда все значения равны до тех a[j] пор, пока не завершится рано из-за 0 . А затем 1 1 приводит к 2

Ответ №1:

Вы могли бы использовать a Set , который дедуплицирует примитивные значения:

 const countUniqueValues = arr => new Set(arr).size;

console.log(countUniqueValues([-2,-1,-1,0,1])); 

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

1. На самом деле это не отвечает на «Какие- либо идеи о том, почему это происходит «.

2. @Ivar Да, честно говоря, я не совсем понял, какова должна была быть идея кода в вопросе … на самом деле это не имеет смысла

Ответ №2:

 let a = [-2,-1,-1,0,1];
var unique = a.filter(onlyUnique);

function onlyUnique(value, index, self) {
 return self.indexOf(value) === index;
}

console.log(unique.length);
 

Это сработает!
Ваш не работает, потому что вы никогда не увеличиваете I или J