@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?
  • Вопрос задан
  • 152 просмотра
Решения вопроса 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].every((n, i, a) => i === a.indexOf(n));

// или

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]);

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

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

// или

let numDeleted = 0;

for (let i = 0; i < arr.length; i++) {
  const n = arr[i];
  arr[i - numDeleted] = n;
  numDeleted += !noRepeatingDigits(n);
}

arr.length -= numDeleted;

// или

for (let i = arr.length; i--; ) {
  if (!noRepeatingDigits(arr[i])) {
    arr.splice(i, 1);
  }
}

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

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 xxx(arr, i = 0) {
  return i < arr.length
    ? (noRepeatingDigits(arr[i]) ? [ arr[i] ] : []).concat(xxx(arr, i + 1))
    : [];
})(arr);
Ответ написан
Пригласить эксперта
Ответы на вопрос 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
    }


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

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

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