@ProstoChel92
Начинающий фронтендер(очень начинающий)

Как вывести элементы массива, которые начинаются на цифры 1, 2, 6?

function func() {
        let arr = [10, 20, 30, 50, 235, 3000];
        for(let i = 0; i < arr.length; i++) {
            let currentElem = arr[i];
            currentElem = String(currentElem);
            if(currentElem[0] == 1 || currentElem[0] == 2 || currentElem[0] == 6) {
                console.log(currentElem);
            }

        }
    }
    ques4();

Код работает, но не знаю костыльный ли он.
Вопрос такой уже задавался здесь
Но я там не понял решение.
В общем, скажите мне пожалуйста правильный ли я код написал?
  • Вопрос задан
  • 377 просмотров
Пригласить эксперта
Ответы на вопрос 3
YuriyVorobyov1333
@YuriyVorobyov1333
Software Developer
Да, ваше решение правильное, но не идеальное
Что касается решения по ссылке, то:
arr.filter(num => ['1','2','5'].includes(num.toString()[0])

Фильтруется изначальный массив, каждое число преобразуется в строку, далее проверяется первый символ строки, если он входит в массив ['1', '2,' '5'], то проходит фильтр, если нет, то не проходит, по итоге получаем отфильтрованный массив с указанным условием
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Код ревью
Код работает, но не знаю костыльный ли он

«Работает — не трожь!», — говорит народная мудрость. Но тут, боюсь, не работает, так как в заголовке вопроса вы пишете про 1, 2, 5. Но в решении сравниваете с 1, 2 и 6.

Можно улучшить код, избавившись, следуя принципу DRY (не повторяй себя), от повторений:
// вместо
if(currentElem[0] == 1 || currentElem[0] == 2 || currentElem[0] == 6) {

// можно
if ([1, 2, 5].includes( +currentElem[0])) {

Хорошо также использовать встроенные методы JS для итерации по массиву:
// вместо
for(let i = 0; i < arr.length; i++) {
  let currentElem = arr[i];

// можно
arr.forEach((currentElem) => {
  // что-то делать с переменной currentElem
})

Наконец, вместо вывода в консоль на каждой итерации очередного значения, лучше их собрать в массив и вернуть его из функции как результат.

Мой вариант решения

// получаем 1-ю цифру делением на 10 снова и снова
// работает только для положительных чисел
const first = (x) => x < 10 ? x : first(Math.floor(x / 10));

const valid = [1, 2, 5]; // допустимые первые цифры
const result = [10, 20, 30, 50, 235, 3000]
  .filter((item) => valid.includes(first(item)));

console.log(result); // [10, 20, 50, 235]
Ответ написан
Seasle
@Seasle Куратор тега JavaScript
Как возможный вариант решения.
const numbers = Array.from({ length: 1e2 + 1 }, (_, index) => index);

const log = (value, base) => Math.log(value) / Math.log(base);

const numbersStartsWith = (numbers, starts) => numbers.filter(number => {
  const divider = Math.pow(10, Math.floor(log(Math.abs(number), 10)));
  const digit = Math.floor(number / divider);

  return starts.includes(digit);
});

const filtered = numbersStartsWith(numbers, [1, 2, 5]);

console.log(filtered);
// [1, 2, 5, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 100]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы