Є масив array, заповнений довільними числами. Необхідно наповнити масив newArray числами з array, які не рівні 0.
let array = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
let newArray = [];
a)
for (let i = 0; i < array.length; i++) {
if (array[i]) {
newArray.push(array[i]);
}
}
b)
array.forEach((index, element) => {
if (element) {
newArray.push(element);
}
});
c)
newArray = array.map((element) => {
if (element) {
return element;
}
});
-
Жоден
-
Всі
Розгорнути правильну відповідь з поясненням
Якщо вам це питання здається легким і ви вибрали будь який інший варіант окрім варіанту a) - рекомендую розібрати це питання разом з нами. Якщо ви вибрали правильний варіант - вітаю, ви молодець, але розбір все одно буде корисно глянути:)
Отож, одразу почнемо з варіантів відповідей:
а) В даному варіанті для перебору масиву використовується звичайний цикл for. Тобто для кожного з елементів масиву array виконується перевірка if (array[i])
, яка являє собою неявне приведення числового типу до логічного. Згадаємо, що усі значення числового типу, окрім 0, при приведенні до логічного типу повернуть true. Тому всі ненульові елементи успішно пройдуть перевірку, і далі для кожного з них виконається newArray.push(array[i])
. Метод масиву push додає один або більше елементів в кінець масиву - якраз те, що нам потрібно!
Отже варіант а) є вірним. Але давайте розберемо, чому не підходять інші варіанти.
b) Тут реалізація рішення схожа на варіант а), за винятком того, що для перебору елементів array замість циклу for використовується метод масиву forEach. Метод forEach приймає як параметр функцію, яка буде викликана для кожного елемента масиву один раз. Ця функція буде викликана з трьома параметрами: function callback(currentValue, index, array)
,
де currentValue - значення поточного елемента масиву,
index - індекс поточного елемента масиву,
array - масив, для якого було викликано forEach.
Ось тут і прихована помилка, яку уважні вже помітили! У варіанті b) за значення елементу масиву береться другий параметр функції, коли насправді ж другий параметр відповідає індексу елемента. В результаті ми отримаємо щось на кшталт:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Саме тому цей варіант не спрацює коректно і є невірним.
с) В третьому варіанті використовується метод map, який як і forEach, приймає як параметр функцію-callback та викликає її один раз для кожного елемента масиву. При цьому він створює новий масив зі значень, які поверне ця функція-callback. Отже, якщо значення елементу array не дорівнює 0, то він пройде перевірку if (element)
і функція поверне значення даного елемента, яке запишеться у масив newArray. Але якщо елемент дорівнює 0, то наш callback поверне undefined і масив newArray буде містити undefined окрім числових значень, а це не задовольняє умову:
[undefined, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
Тому варіант с) невірний.
Зрозуміло, що останні два варіанти також невірні. Отже, правильна відповідь a).