@MRcracker

Как заменить повторяющиеся элементы массива?

Есть массив, например: let arr = [1, 2, 3, 2, 3, 4]. Надо узнать, равны ли его элементы между собой или нет и если есть равные элементы, то заменить их на х. Например, 1 и 4 уникальны и потому остаются, а 2 и 3 повторяются, и их меняем на х.
  • Вопрос задан
  • 260 просмотров
Решения вопроса 2
magerrrr
@magerrrr
JS Software Engineer
Для решения задачи важно, чтобы код был читабельным и понятным.

const arr = [1, 2, 3, 2, 3, 4];

const replaceTheSameElementsToX = array => {
    const result = [];
    let coincidence = 0;

    for(let i = 0; i < array.length; i++) {
        array.map(el => el === array[i] ? coincidence++ : coincidence);

        if (coincidence === 1) {
            result.push(array[i]);
        } else if (coincidence > 1) {
            result.push('x');
        }
        coincidence = 0;
    }
    return result; 
}

replaceTheSameElementsToX(arr); // [1, "x", "x", "x", "x", 4]


или тоже самое с помощью методов массива:

const arr = [1,2,3,2,3,4];

const findTheSameNumbers2 = array => array.map((elementOfBaseArray,i,baseArray) => baseArray.reduce((coincidence, currentValue, index, elementAsArray) => elementOfBaseArray === elementAsArray[index] ? coincidence + 1 : coincidence, 0) === 1 ? elementOfBaseArray : 'x');

findTheSameNumbers2(arr); // [1, "x", "x", "x", "x", 4]
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
Собрать новый массив:

const count = arr.reduce((acc, n) => (acc[n] = (acc[n] ?? 0) + 1, acc), {});
const newArr = arr.map(n => count[n] > 1 ? newValue : n);

// или

const newArr = arr.map(function(n) {
  return this.get(n) ? newValue : n;
}, arr.reduce((acc, n) => acc.set(n, acc.has(n)), new Map));

// или

const newArr = arr.map((n, i, a) => a.indexOf(n) !== a.lastIndexOf(n) ? newValue : n);

Обновить существующий:

arr.forEach(function(n, i, a) {
  a[i] = this.get(n) > 1 ? newValue : n;
}, arr.reduce((acc, n) => acc.set(n, -~acc.get(n)), new Map));

// или

const duplicates = arr.reduce((acc, n) => (acc[n] = acc.hasOwnProperty(n), acc), {});
arr.splice(0, arr.length, ...arr.map(n => duplicates[n] ? newValue : n));

// или

Object
  .values(arr.reduce((acc, n, i) => ((acc[n] ??= []).push(i), acc), {}))
  .forEach(n => n.length > 1 && n.forEach(i => arr[i] = newValue));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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