Задать вопрос
@angen89

Как удалить из массива числа с повторяющимися цифрами?

Дан массив с числами. Надо оставить в нём числа, состоящие из разных цифр, а остальные удалить.

let nums = [2,56,77,223,1,4,17, 404];
let x = nums.filter(el=>el.toString().match(/(?=(.))\1{2,}/g))
for (let i = 0; i < x.length; i++) {
  nums.splice(nums.indexOf(x[i]),1)
}

Получилось сделать регекс только такой, никак не придёт в голову, как отфильтровать числа по типу 404 или 18538?
  • Вопрос задан
  • 278 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Прежде чем браться за целый массив, разберёмся с одним числом. Есть разные способы узнать, все ли цифры в числе (правильно понимаю, что речь идёт о целых неотрицательных? - других-то вы не показали) являются уникальными, как относительно вменяемые, так и вполне дикие:

const noRepeatingDigits = num => !/(\d).*\1/.test(num);

// или

const noRepeatingDigits = num => -~Math.log10(num) === new Set(`${num}`).size;

// или

const noRepeatingDigits = num => [...'' + num]
  .filter((n, i, a) => i !== a.indexOf(n))
  .length === 0;

// или

const noRepeatingDigits = num => String(num)
  .split('')
  .reduce((acc, n) => (acc[n]++, acc), Array(10).fill(0))
  .every(n => n < 2);

// или

const noRepeatingDigits = num =>
  !''.match.call(num, /./g).some(function(n) {
    return this[n] = Object.hasOwn(this, n);
  }, {});

// или

const noRepeatingDigits = num =>
  !Array.from(num.toString()).sort().find((n, i, a) => n === a[i + 1]);

Теперь массив. Можно удалить ненужное из существующего:

for (let i = arr.length; i--;) {
  if (!noRepeatingDigits(arr[i])) {
    for (let j = i; ++j < arr.length; arr[j - 1] = arr[j]) ;
    arr.pop();
  }
}

// или

arr.reduceRight((_, n, i, a) => noRepeatingDigits(n) || a.splice(i, 1), null);

// или

arr.splice(0, arr.length, ...arr.filter(noRepeatingDigits));

// или

arr.length -= arr.reduce((acc, n, i, a) => (
  a[i - acc] = n,
  acc + !noRepeatingDigits(n)
), 0);

Или собрать новый:

const newArr = arr.filter(noRepeatingDigits);

// или

const newArr = [];
for (const n of arr) {
  if (noRepeatingDigits(n)) {
    newArr.push(n);
  }
}

// или

const newArr = [];
for (let i = 0; i < arr.length; i++) {
  if (noRepeatingDigits(arr[i])) {
    newArr[newArr.length] = arr[i];
  }
}

// или

const newArr = (function get(i = 0, n = arr[i]) {
  return i < arr.length
    ? [].concat(noRepeatingDigits(n) ? n : [], get(-~i))
    : [];
})();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Как вариант можно сделать длинным, костыльным методом, но рабочим)
const fun1 = (array: number[]) => {
        let repeatArray:number[] = []
        let notRepeatArray:number[] = []

        array.forEach(arr => {
            const isNotRepeat = notRepeatArray.includes(arr)
            const isRepeat = repeatArray.includes(arr)

            if(!isNotRepeat)
                return notRepeatArray = [...notRepeatArray, arr]

            if(isNotRepeat && !isRepeat)
                return repeatArray = [...repeatArray, arr]
        })

        

        return repeatArray
    }


Или тебе надо именно через регулярку?
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы