С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
-2 / 0 / 0
Регистрация: 01.03.2020
Сообщений: 198

Написать функцию, которая принимает массив и возвращает новый массив, где исключены повторяющиеся элементы.

20.03.2021, 12:52. Показов 8380. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
нужно создать масив [‘html’,‘css’,‘html’,‘js’],и нужно повернуть масив [‘html’,‘css’,‘html’,‘js’] вот мой код

JavaScript
1
2
3
4
5
6
7
8
9
10
const arr=['html','css','html','js']
 
 
const newArr=arr.filter((item)=>{
 
 
return item
 
})
console.log(newArr);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.03.2021, 12:52
Ответы с готовыми решениями:

Написать функцию, которая принимает массив 32-ых битных целых чисел и возвращает 16-ые битные целые числа
Доброго времени суток! Знаю, тема возможно избитая и есть на форуме. У меня в условиях задачи дан массив (32 битных чисел)...

Написать функцию, которая принимает указатель на массив, количество элементов массива и число, и возвращает указател
Кто знает как написать такую функцию ?

Массив: Дополните функцию getDifferences, которая принимает два массива, и возвращает массив различий между ними.
Дополните функцию getDifferences, которая принимает два массива, и возвращает массив различий между ними. Массивы состоят из уникальных...

9
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
20.03.2021, 14:58
parsifaly, задача непонятная. Не объяснили, что надо сделать.
0
-2 / 0 / 0
Регистрация: 01.03.2020
Сообщений: 198
20.03.2021, 15:33  [ТС]
amr-now, нужно написать функцию которая принимает массив с лент и возвращает новый массив где исключены повторяющиеся элементы из массива (игнорировать чувствительность к регистру)
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
20.03.2021, 15:53
Если сильно упростить для конкретного случая:
JavaScript
1
2
3
4
const arr = ['html', 'css', 'html', 'js'];
 
const unique = arr => arr.filter((e, i, arr) => i === arr.lastIndexOf(e.toLocaleLowerCase()));
console.log(unique(arr));
А вообще задача решается с помощью множества с компаратором.
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
20.03.2021, 16:43
JavaScript
1
2
const arr=['html','css','Html','js'];
console.log([...new Set(arr.map(el => el.toLowerCase()))]);
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
21.03.2021, 19:54
arr.filter((e, i, arr) => i === arr.lastIndexOf(e.toLocaleLowerCase()));
Строго говоря, такое решение не совсем верное. Мы мутируем искомое значение, когда дубликаты остаются неизменными. То есть, например:
JavaScript
1
const arr = ['Html', 'css', 'js', 'hTML', 'abc']; // вернет ["css", "js", "abc"]
К тому же, такое решение будет иметь O(n2).
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
24.03.2021, 06:28
Пример реализации класса HashSet по мотивам хэш-таблицы Microsoft
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
/**
 * Слот в классе HashSet.
 * Видимость должна быть в пределах модуля.
 */
 class SetSlot {
    constructor(hashCode, value, next) {
        this.hashCode = hashCode;
        this.value = value;
        this.next = next;
    }
}
// declare class  HashSet<TElement> implements IHashSetConstructor<TElement>;
class HashSet {
    /**
     * Конструктор, в котором возможно загружается итерируемый объект и/или компаратор.
     * Компаратор, переданный в параметре, содержит метод equals(v1, v2) и опционально getHashCode(value).
     * @param {undefined|Iterable<TElement>|IEqualityComparer<TElement>} arg1
     * Если аргумент один, то итерируемый объект или компаратор. Если два, то итерируемый объект.
     * @param {undefined|IEqualityComparer<TElement>} arg2 Компаратор эквивалентности для элемента коллекции
     */
    constructor(arg1, arg2) {
        let iterable;
        let comparer;
        if (typeof arg1 === "string" || arg1 && Symbol.iterator in arg1) {
            if (typeof arg1 === "string")
                arg1 = new String(arg1);
            iterable = arg1;
            if (arg2 && "equals" in arg2)
                comparer = arg2;
        }
        else if (arg1 && "equals" in arg1)
            comparer = arg1;
        if (comparer == null)
            comparer = {
                getHashCode: HashSet.internalGetHashCode,
                equals(v1, v2) { return v1 === v2 || (v1 !== v1 && v2 !== v2); } // NaN !== NaN
            };
        if (!("getHashCode" in comparer))
            comparer.getHashCode = HashSet.internalGetHashCode;
        this.comparer = comparer;
        this.buckets = new Array(7);
        this.buckets.fill(0); // В JS элементы массива автоматически не создаются 
        this.slots = new Array(7);
        this._count = 0;
        if (iterable) {
            for (let e of iterable) {
                this.add(e);
            }
        }
    }
    /**
     * Добавить элемент коллекции. Если элемент уже существовал, то не обновлять.
     * @param {TElement} value Элемент, который нужно добавить
     * @returns {ISet<TElement>} Свой объект коллекции
     */
    add(value) {
        let hashCode = this.comparer.getHashCode(value);
        for (let i = this.buckets[hashCode % this.buckets.length] - 1; i >= 0; i = this.slots[i].next) {
            if (this.slots[i].hashCode === hashCode && this.comparer.equals(this.slots[i].value, value)) {
                return this;
            }
        }
        // Если элемента по ключу раньше не было
        let index;
        if (this._count == this.slots.length)
            this.resize();
        index = this._count;
        this._count++;
        let bucket = hashCode % this.buckets.length;
        this.slots[index] = new SetSlot(hashCode, value, this.buckets[bucket] - 1);
        this.buckets[bucket] = index + 1;
        // console.log(this.buckets);
        // console.log(this.slots);
        return this;
    }
    /**
     * Удалить все элементы коллекции. Компаратор оставить прежним.
     */
    clear() {
        this.buckets = new Array(7);
        this.buckets.fill(0); // В JS элементы массива автоматически не создаются 
        this.slots = new Array(7);
        this._count = 0;
    }
    /**
     * Количество элементов коллекции.
     */
    get size() {
        let count = 0;
        for (let i = 0; i < this._count; i++) {
            if (this.slots[i].hashCode !== -1)
                ++count;
        }
        return count;
    }
    /**
     * Если элемент в коллекции, удалить его и вернуть true, иначе вернуть false.
     * @param {TElement} value Элемент, который нужно удалить
     * @returns {boolean}
     */
    delete(value) {
        let hashCode = this.comparer.getHashCode(value);
        let bucket = hashCode % this.buckets.length;
        let last = -1;
        for (let i = this.buckets[bucket] - 1; i >= 0; last = i, i = this.slots[i].next) {
            if (this.slots[i].hashCode === hashCode && this.comparer.equals(this.slots[i].value, value)) {
                if (last < 0) {
                    this.buckets[bucket] = this.slots[i].next + 1;
                }
                else {
                    this.slots[last].next = this.slots[i].next;
                }
                this.slots[i].hashCode = -1;
                return true;
            }
        }
        return false;
    }
    /**
     * Определить, содержится ли элемент в коллекции.
     * @param {TElement} value Проверяемый элемент
     * @returns {boolean}
     */
    has(value) {
        let hashCode = this.comparer.getHashCode(value);
        for (let i = this.buckets[hashCode % this.buckets.length] - 1; i >= 0; i = this.slots[i].next) {
            if (this.slots[i].hashCode === hashCode && this.comparer.equals(this.slots[i].value, value))
                return true;
        }
        return false;
    }
    // Методы-итераторы
    /**
     * Возвращает новый объект Generator&lt;TElement&gt; для элементов коллекции в порядке вставки.
     * @returns {Generator<TElement, void, unknown>} Новый объект-итератор
     */
    [Symbol.iterator]() {
        return this.values();
    }
    /**
     * Возвращает новый объект Generator&lt;[TElement, TElement]&gt;
     * для каждого элемента коллекции в порядке вставки.
     * @returns {Generator<[TElement, TElement], void, unknown>} Новый объект-итератор
     */
    *entries() {
        for (let i = 0; i < this._count; i++) {
            let e = this.slots[i];
            if (e.hashCode !== -1)
                yield [e.value, e.value];
        }
    }
    /**
     * Выполнить функцию callbackFn для каждого элемента коллекции в порядке вставки.
     * @param callbackFn {(currentValue?: TValue, currentKey?: TKey, set?: ISet<TElement>) => void} Выполняемая функция
     * @param thisArg {any} Аргумент this
     */
    forEach(callbackFn, thisArg) {
        for (let i = 0; i < this._count; i++) {
            let e = this.slots[i];
            if (e.hashCode !== -1)
                callbackFn.call(thisArg, e.value, e.value, this);
        }
    }
    /**
     * Возвращает новый объект Generator&lt;TElement&gt; для элементов коллекции в порядке вставки.
     * @returns {Generator<TElement, void, unknown>} Новый объект-итератор
     */
    *keys() {
        for (let i = 0; i < this._count; i++) {
            let e = this.slots[i];
            if (e.hashCode !== -1)
                yield e.value;
        }
    }
    /**
     * Возвращает новый объект Generator&lt;TElement&gt; для элементов коллекции в порядке вставки.
     * @returns {Generator<TElement, void, unknown>} Новый объект-итератор
     */
    *values() {
        for (let i = 0; i < this._count; i++) {
            let e = this.slots[i];
            if (e.hashCode !== -1)
                yield e.value;
        }
    }
    /**
     * Статический метод, возвращающий хэш-код по умолчанию для любого значения.
     * Для конкретных типов значений лучше переопределять в компараторе.
     * @param value Значение любого типа. для которого нужен хэш-код
     * @returns {number} UInt32-беззнаковое целое число хэш-код.
     */
    static internalGetHashCode(value) {
        if (!value)
            return 0; // == null, undefined, "", 0
        function adler32(buf) {
            let count = buf.length;
            let s1 = 1;
            let s2 = 0;
            for (let i = 0; i < count; ++i) {
                s1 = (s1 + buf[i]) % 65521;
                s2 = (s2 + s1) % 65521;
            }
            return (s2 << 16) + s1;
        }
        let str = JSON.stringify(value);
        if (!str)
            return 0; // == null, undefined, "", 0
        let array = [];
        for (let i = 0; i < str.length; i++) {
            let c = str[i];
            let c1 = c.charCodeAt(0);
            let c2 = c.charCodeAt(1);
            array.push(c1 & 255, c1 >> 8, c2 & 255, c2 >> 8);
        }
        return adler32(array);
    }
    // Приватные методы
    resize() {
        let newSize = this._count * 2 + 1;
        let newBuckets = new Array(newSize);
        newBuckets.fill(0); // В JS элементы массива автоматически не создаются 
        let newSlots = this.slots.slice(); // new Array<Slot<TElement>>(newSize);
        newSlots.length = newSize;
        for (let i = 0; i < this._count; i++) {
            let bucket = newSlots[i].hashCode % newSize;
            newSlots[i].next = newBuckets[bucket] - 1;
            newBuckets[bucket] = i + 1;
        }
        this.buckets = newBuckets;
        this.slots = newSlots;
    }
}

JavaScript
1
2
3
4
5
6
7
const arr = ['HTML', 'css', 'html', 'js'];
const comparer = { 
    equals(a, b) { return a.toLowerCase() === b.toLowerCase(); },
    getHashCode(v) { return HashSet.internalGetHashCode(v.toLowerCase()); }
};
const unique = arr => [...new HashSet(arr, comparer)];
console.log(unique(arr));
Здесь используется идеология Java и Microsoft, что во множество кладется именно первое попавшееся значение, а потом уже не подменяется другим таким же.
https://docs.oracle.com/javase... tml#add-E-
2
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
30.03.2021, 06:19
Лучший ответ Сообщение было отмечено amr-now как решение

Решение

Цитата Сообщение от Tavashi Посмотреть сообщение
К тому же, такое решение будет иметь O(n2).
Поэтому и нужен теоретически HashSet с компаратором.
Tavashi, спасибо за найденную ошибку.
Без использования готового HashSet придется кодить простынку по мотивам задачи https://learn.javascript.ru/task/array-unique
Решение той задачи
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function unique(arr) {
  let result = [];
 
  for (let str of arr) {
    if (!result.includes(str)) {
      result.push(str);
    }
  }
 
  return result;
}
 
let strings = ["кришна", "кришна", "харе", "харе",
  "харе", "харе", "кришна", "кришна", ":-O"
];
 
alert( unique(strings) ); // кришна, харе, :-O

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const arr = ['HTML', 'css', 'html', 'js'];
 
const unique = arr => {
    let result = [];
 
    for (let str of arr) {
        let e = str.toLocaleLowerCase(); // Чтобы заново не вычислять для внутреннего цикла
        let isUnique = true;
        for (let str2 of result) {
            if (e === str2.toLocaleLowerCase()) {
                isUnique = false;
                break;
            }
        }
        if (isUnique) result.push(str);
    }
    return result;
};
 
console.log(unique(arr));
1
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
31.03.2021, 03:22
Лучший ответ Сообщение было отмечено amr-now как решение

Решение

Цитата Сообщение от amr-now Посмотреть сообщение
спасибо за найденную ошибку.
You are welcome.
Цитата Сообщение от amr-now Посмотреть сообщение
Поэтому и нужен теоретически HashSet с компаратором.
Думаю, что необязательно и вашу функцию unique можно улучшить, если использовать ключи объекта в качестве значений. Это даст преимущество в скорости, так как все (или почти все) реализации JS делают лукап ключа объекта за константное время O(1). Таким образом, мы можем это использовать для проверки на добавление в результирующий массив, что уберет один цикл:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const arr = ['Html', 'css', 'js', 'hTML', 'abc', 'Abc', 'html'];
 
function unique(arr) {
    let result = [], obj = {}, e = 1;
  
  for (let str of arr) {
    let s = str.toLocaleLowerCase();
    if (obj[s] !== e) {
        result.push(s);
        obj[s] = e;
    }
  }
  
  return result;
}
 
console.log(unique(arr)); // ["html", "css", "js", "abc"]
Что касается hashset в java, то под капотом используется та же hashmap:
Java
1
2
3
public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }
с одним объектом в качестве значения:
Java
1
2
3
4
5
private static final Object PRESENT = new Object();
 
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
И ее главная идеология заключается в работе с коллизиями, что было существенным шагом в java 8 когда связанный список заменили на красно-черное дерево. Что позволило уйти от линейного времени к логарифмическому.

Добавлено через 1 час 39 минут
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
31.03.2021, 05:05
Tavashi, проверка существования ключа в объекте осуществляется штатными двумя способами:
JavaScript
1
2
key in obj
obj.hasOwnProperty(key)
И в 9-й строке
JavaScript
1
result.push(str); // Именно первое попавшееся настоящее значение.
В целом идея правильная.
obj можно заменить как раз объектом Map. Это уже как шлифовка решения.

Добавлено через 8 минут
----
Как вариант, поскольку единичка не требуется, можно вытаскивать коллекцию значений объекта Object или объекта Map.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2021, 05:05
Помогаю со студенческими работами здесь

Массив: Написать функцию, которая возвращает число, необходимое прибавить к массиву, и функцию добавления в массив.
Добрый вечер, форумчане. Надеюсь на вашу помощь. Мне нужно после и до(в двух разных проектах) двузначных чисел вставить то число которое...

Реализовать функцию, которая принимает массив, а также число n, и возвращает индекс
Реализовать функцию, которая принимает массив (плюс его длину) , а также число n, и возвращает индекс числа в массиве или -1, если такого...

Написать функцию, которая принимает массив, размер массива и два числа m и n. - Заполнить массив случайными числами, в
Написать функцию, которая принимает массив, размер массива и два числа m и n. - Заполнить массив случайными числами, в диапазоне от m до...

Реализовать функцию, которая принимает массив и возвращает количество простых чисел в нем
Ребят , есть задачи , а в частности нужно с помощью функций и деления по остатку (%) написать несколько программ , а именно : 1)...

Написать функцию которая принимает вектор целых чисел и возвращает новый вектор, состоящий из цифр входного вектора
Пример: input: 123 234 34 56 76 23 output: 1 2 3 2 3 4 3 4 5 6 7 6 2 3 Использовать циклы запрещено


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru