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

    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 = 0; 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, n = arr[--i]) {
      return i >= 0
        ? get(i).concat(noRepeatingDigits(n) ? n : [])
        : [];
    })(arr.length);
    Ответ написан
    1 комментарий
  • Как удалить из строки каждый третий символ?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    let str = "abcdefg";
    let newStr = "";
    for (let i = 0; i < str.length; i++) {
      if ((i + 1) % 3 !== 0) {
        newStr += str[i];
      }
    }
    console.log(newStr);

    Или:
    let str = "abcdefg";
    let newStr = [...str].filter((_, index) => (index + 1) % 3 !== 0).join("");
    console.log(newStr);
    Ответ написан
    Комментировать