использование функции slice() для извлечения элементов из конца массива в JS

#javascript #arrays #slice #default-value #conditional-operator

Вопрос:

Отказ от ответственности: Я новичок в JS. Итак, все мои тесты проходят, кроме одного — последнего — и я не могу понять, как это исправить. Почему 0 возвращает последний элемент, а не пустой массив? Кроме того, в отдельном примечании, когда я попытался использовать значение по умолчанию, оно вернуло неправильные значения, поэтому я решил включить условный оператор.

 const takeRight = (array, n) => {
n = -n;
//setting both default and a negative value for 'n': if there is no number, then n should be -1
const condition = !n ? -1 : n;
return array.slice(condition);
};

console.log(takeRight([1, 2, 3])); // returns [3] --> expected [3] 
console.log(takeRight([1, 2, 3], 2)); //returns [2, 3] --> expected [2,3] 
console.log(takeRight([1, 2, 3], 5)); //returns [1, 2, 3] --> expected [1,2,3]
console.log(takeRight([1, 2, 3], 0)); //returns [3] --> expected []
 

Ответ №1:

Проблема заключается в вычислении condition переменной:

 const condition = !n ? -1 : n;
 

выражение !0 истинно, поэтому n изменяется на -1 когда имеет значение 0 .

Если вы хотите свериться не с цифрами, используйте isNaN .:

 const takeRight = (array, n) => {
    n = isNaN(n) ? -1 : -n;
    return array.slice(n);
};
 

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

1. Спасибо! Чувак, я знал, что это будет простое решение, но не настолько простое. Полный момент «ладонь к лицу»

Ответ №2:

Проблема может быть в вашем выражении лица. Проверьте на «Не номер»

 const condition = isNaN(n) ? -1 : n;
 

MDN: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/isNaN

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

1. Спасибо! Не могу поверить, что я это пропустил.

Ответ №3:

Итак, прежде всего, вы не должны переназначать аргументы. Но реальная проблема здесь !n в том, чтобы проверить, существует ли она. Это может быть ловким трюком здесь и там, но на самом деле это просто сбивает с толку. Префиксация чего-либо с помощью a ! в JavaScript превращает его в логическое значение, а затем отрицает его, и правила для этого преобразования не очевидны, а также не одинаковы на всех языках. Но в JS !0 дает тот же результат, !undefined что и or !null , потому что число 0 часто символизирует «выключенное состояние», в основном a false , но короче. В любом случае, чтобы избежать всего этого, просто используйте параметры по умолчанию и используйте тернарный оператор в операторе return для проверки конкретного случая n = 0 , подобного этому:

 const takeRight = (array, n = 1) => n === 0 ? [] : condition array.slice(-n);
 

Вы, конечно, можете сделать это немного более подробным:

 const takeRight = (array, n = 1) => {
    if (n === 0) {
        return [];
    }

    return condition array.slice(-n);
};
 

РЕДАКТИРОВАТЬ: !"" true Кстати, даже возвращается, что тоже не совсем «очевидно», поэтому использование ! для проверки того, определено ли что-то или существует, действительно может вызвать проблемы и неожиданные результаты. Я бы не советовал этого делать, если вы действительно не знаете, что вы делаете и почему.

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

1. «во-первых, вы не должны переназначать аргументы» Спасибо вам за это! Мне уже говорили об этом раньше, так что приятно услышать это снова — чтобы осознать это, и я мог быть более осведомленным и стратегически подходить к коду, который я использую(т. Е. самоконтроль), а не просто использовать код, с которым мне комфортно.