Baseline Widely available *
ÐбÑÐµÐºÑ Set
позволÑÐµÑ Ñ
ÑаниÑÑ ÑникалÑнÑе знаÑÐµÐ½Ð¸Ñ Ð»Ñбого Ñипа, бÑÐ´Ñ Ñо пÑимиÑÐ¸Ð²Ñ Ð¸Ð»Ð¸ ÑÑÑлки на обÑекÑÑ.
ÐбÑекÑÑ "Set" - ÑÑо коллекÑÐ¸Ñ Ð·Ð½Ð°Ñений. ÐнаÑение в Set
Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑÑеÑаÑÑÑÑ ÑолÑко один Ñаз; оно ÑникалÑно в коллекÑии. ÐÑ Ð¼Ð¾Ð¶ÐµÑе пеÑебиÑаÑÑ ÑлеменÑÑ Ð½Ð°Ð±Ð¾Ñа в поÑÑдке вÑÑавки. ÐоÑÑдок вÑÑавки ÑооÑвеÑÑÑвÑÐµÑ Ð¿Ð¾ÑÑдкÑ, в коÑоÑом каждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð±Ñл ÑÑпеÑно вÑÑавлен в коллекÑÐ¸Ñ Ð¼ÐµÑодом add()
(Ñо еÑÑÑ, когда бÑл вÑзван add()
, в набоÑе еÑÑ Ð½Ðµ бÑло Ñакого ÑлеменÑа).
СпеÑиÑикаÑÐ¸Ñ ÑÑебÑÐµÑ ÑеализаÑии набоÑов, "коÑоÑÑе в ÑÑеднем обеÑпеÑиваÑÑ Ð²ÑÐµÐ¼Ñ Ð´Ð¾ÑÑÑпа, ÑÑблинейное колиÑеÑÑÐ²Ñ ÑлеменÑов в коллекÑии". СледоваÑелÑно, он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑедÑÑавлен внÑÑÑенне в виде Ñ ÑÑ-ÑаблиÑÑ (Ñ Ð¿Ð¾Ð¸Ñком O(1)), деÑева поиÑка (Ñ Ð¿Ð¾Ð¸Ñком O(log(N))) или лÑбой дÑÑгой ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , пÑи ÑÑловии, ÑÑо ÑложноÑÑÑ Ð²ÑÑе, Ñем O(N).
СÑавнение знаÑенийÐÑи добавлении нового ÑлеменÑа в Set пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿ÑовеÑка, добавлÑлÑÑ Ð»Ð¸ Ñакой ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñанее. ÐÑа пÑовеÑка иÑполÑзÑÐµÑ ÑпеÑиалÑнÑй алгоÑиÑм ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений SameValueZero. (РанÑÑе иÑполÑзовалÑÑ Ð°Ð»Ð³Ð¾ÑиÑм SameValue, в коÑоÑом знаÑÐµÐ½Ð¸Ñ 0
и -0
ÑÑиÑаÑÑÑÑ ÑазнÑми. СмоÑÑиÑе бÑаÑзеÑнÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð½Ð¸Ð¶Ðµ). ÐÑо ознаÑаеÑ, ÑÑо NaN
ÑÑиÑаеÑÑÑ ÑавнÑм NaN
(не ÑмоÑÑÑ Ð½Ð° Ñо ÑÑо NaN !== NaN
), а вÑе дÑÑгие знаÑÐµÐ½Ð¸Ñ ÑÑиÑаÑÑÑÑ ÑавнÑми в ÑооÑвеÑÑÑвии Ñ ÑеманÑикой опеÑаÑоÑа ===
.
ÐеÑод has
пÑовеÑÑÐµÑ Ð½Ð°Ð»Ð¸Ñие знаÑÐµÐ½Ð¸Ñ Ð² коллекÑии, иÑполÑзÑÑ Ð°Ð»Ð³Ð¾ÑиÑм, коÑоÑÑй в ÑÑеднем ÑабоÑÐ°ÐµÑ Ð±ÑÑÑÑее пеÑебоÑа добавленнÑÑ
Ñанее ÑлеменÑов. Ð ÑаÑÑноÑÑи он в ÑÑеднем бÑÑÑÑее, Ñем меÑод Array.prototype.includes
Ð´Ð»Ñ Ð¼Ð°ÑÑива, Ñ ÐºÐ¾ÑоÑого ÑÑолÑко же ÑлеменÑов, ÑколÑко в коллекÑии.
Set()
СоздаÑÑ Ð½Ð¾Ð²Ñй обÑÐµÐºÑ Set
.
get Set[@@species]
ФÑнкÑиÑ-конÑÑÑÑкÑоÑ, коÑоÑÐ°Ñ Ð¸ÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑоизводнÑÑ Ð¾Ð±ÑекÑов.
Set.prototype[@@toStringTag]
ÐаÑалÑное знаÑение @@toStringTag
ÑвойÑÑва - ÑÑÑока "Set"
. ÐÑо знаÑение иÑполÑзÑеÑÑÑ Ð² Object.prototype.toString()
.
Set.prototype.size
ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво знаÑений в обÑекÑе Set
.
Set.prototype.add()
Set
, еÑли в Set
еÑÑ Ð½ÐµÑ ÑлеменÑа Ñ Ñаким же знаÑением.Set.prototype.clear()
Set
.Set.prototype.delete()
Set.prototype.has(value)
впоÑледÑÑвии веÑÐ½ÐµÑ false
.Set.prototype.has()
Set
или неÑ.Set.prototype[@@iterator]()
Set
в поÑÑдке вÑÑавки.Set.prototype.values()
Set
в поÑÑдке вÑÑавки.Set.prototype.keys()
Set.prototype.values()
.Set.prototype.entries()
[value, value]
Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа в обÑекÑе Set
в поÑÑдке вÑÑавки.ÐÑÐ¾Ñ Ð¼ÐµÑод поÑ
ож на ÑооÑвеÑÑÑвÑÑÑий меÑод обÑекÑа Map
, но в ÑлÑÑае Set
клÑÑ (key) каждой запиÑи ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ ÐµÑ Ð·Ð½Ð°Ñением (value).
Set.prototype.forEach()
callbackFn
один Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ знаÑениÑ, пÑиÑÑÑÑÑвÑÑÑего в обÑекÑе Set
в поÑÑдке вÑÑавки. ÐÑли Ñказан паÑамеÑÑ thisArg
, он бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² каÑеÑÑве знаÑÐµÐ½Ð¸Ñ this
Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ вÑзова callbackFn
.const mySet1 = new Set();
mySet1.add(1); // Set(1) { 1 }
mySet1.add(5); // Set(2) { 1, 5 }
mySet1.add(5); // Set(2) { 1, 5 }
mySet1.add("ÑекÑÑ"); // Set(3) { 1, 5, 'ÑекÑÑ' }
const o = { a: 1, b: 2 };
mySet1.add(o);
mySet1.add({ a: 1, b: 2 }); // o ÑÑÑлаеÑÑÑ Ð½Ð° дÑÑгой обÑекÑ, Ñак ÑÑо ÑÑо ноÑмалÑно
mySet1.has(1); // true
mySet1.has(3); // false, поÑколÑÐºÑ 3 не бÑл добавлен в набоÑ
mySet1.has(5); // true
mySet1.has(Math.sqrt(25)); // true
mySet1.has("ТекÑÑ".toLowerCase()); // true
mySet1.has(o); // true
mySet1.size; // 5
mySet1.delete(5); // ÑдалÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ 5 из set
mySet1.has(5); // false, 5 бÑл ÑдалÑн
mySet1.size; // 4, поÑколÑÐºÑ Ð¼Ñ Ñдалили одно знаÑение
mySet1.add(5); // Set(5) { 1, "ÑекÑÑ", {...}, {...}, 5 } - Ñанее ÑдаленнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ как новÑй ÑлеменÑ, он не ÑоÑ
ÑÐ°Ð½Ð¸Ñ Ñвое пеÑвонаÑалÑное положение до ÑдалениÑ
console.log(mySet1); // Set(5) { 1, "ÑекÑÑ", {â¦}, {â¦}, 5 }
ÐÑеÑаÑÐ¸Ñ Ð¿Ð¾ обÑекÑÑ Set
ÐÑеÑаÑÐ¸Ñ Ð½Ð°Ð±Ð¾Ñов пÑÐ¾Ñ Ð¾Ð´Ð¸Ñ Ð¿Ð¾ ÑлеменÑам в поÑÑдке вÑÑавки.
for (const item of mySet1) {
console.log(item);
}
// 1, "ÑекÑÑ", { "a": 1, "b": 2 }, { "a": 1, "b": 2 }, 5
for (const item of mySet1.keys()) {
console.log(item);
}
// 1, "ÑекÑÑ", { "a": 1, "b": 2 }, { "a": 1, "b": 2 }, 5
for (const item of mySet1.values()) {
console.log(item);
}
// 1, "ÑекÑÑ", { "a": 1, "b": 2 }, { "a": 1, "b": 2 }, 5
// клÑÑ Ð¸ знаÑение здеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ
for (const [key, value] of mySet1.entries()) {
console.log(key);
}
// 1, "ÑекÑÑ", { "a": 1, "b": 2 }, { "a": 1, "b": 2 }, 5
// ÐÑеобÑазÑем обÑÐµÐºÑ Set в обÑÐµÐºÑ Array Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Array.from
const myArr = Array.from(mySet1); // [1, "ÑекÑÑ", {"a": 1, "b": 2}, {"a": 1, "b": 2}, 5]
// ÑледÑÑÑее Ñакже бÑÐ´ÐµÑ ÑабоÑаÑÑ, еÑли запÑÑÑиÑÑ ÐµÐ³Ð¾ в HTML-докÑменÑе
mySet1.add(document.body);
mySet1.has(document.querySelector("body")); // true
// пÑеобÑазование Ð¼ÐµÐ¶Ð´Ñ Set и Array
const mySet2 = new Set([1, 2, 3, 4]);
console.log(mySet2.size); // 4
console.log([...mySet2]); // [1, 2, 3, 4]
// пеÑеÑеÑение можно пÑедÑÑавиÑÑ ÑледÑÑÑим обÑазом
const intersection = new Set([...mySet1].filter((x) => mySet2.has(x)));
// ÑазноÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑедÑÑавиÑÑ ÑледÑÑÑим обÑазом
const difference = new Set([...mySet1].filter((x) => !mySet2.has(x)));
// иÑеÑиÑоваÑÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ forEach()
mySet2.forEach((value) => {
console.log(value);
});
// 1
// 2
// 3
// 4
РеализаÑÐ¸Ñ Ð±Ð°Ð·Ð¾Ð²ÑÑ
опеÑаÑий Set
function isSuperset(set, subset) {
for (const elem of subset) {
if (!set.has(elem)) {
return false;
}
}
return true;
}
function union(setA, setB) {
const _union = new Set(setA);
for (const elem of setB) {
_union.add(elem);
}
return _union;
}
function intersection(setA, setB) {
const _intersection = new Set();
for (const elem of setB) {
if (setA.has(elem)) {
_intersection.add(elem);
}
}
return _intersection;
}
function symmetricDifference(setA, setB) {
const _difference = new Set(setA);
for (const elem of setB) {
if (_difference.has(elem)) {
_difference.delete(elem);
} else {
_difference.add(elem);
}
}
return _difference;
}
function difference(setA, setB) {
const _difference = new Set(setA);
for (const elem of setB) {
_difference.delete(elem);
}
return _difference;
}
// ÐÑимеÑÑ
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 3]);
const setC = new Set([3, 4, 5, 6]);
isSuperset(setA, setB); // true
union(setA, setC); // Set {1, 2, 3, 4, 5, 6}
intersection(setA, setC); // Set {3, 4}
symmetricDifference(setA, setC); // Set {1, 2, 5, 6}
difference(setA, setC); // Set {1, 2}
СвÑÐ·Ñ Ñ Ð¾Ð±ÑекÑами маÑÑива
const myArray = ["value1", "value2", "value3"];
// ÐÑполÑзÑйÑе обÑÑнÑй конÑÑÑÑкÑÐ¾Ñ Set Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÑÑива в набоÑ
const mySet = new Set(myArray);
mySet.has("value1"); // true
// ÐÑполÑзÑйÑе ÑинÑакÑÐ¸Ñ spread Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñа в маÑÑив.
console.log([...mySet]); // ÐÐ¾ÐºÐ°Ð¶ÐµÑ Ð²Ð°Ð¼ ÑоÑно Ñакой же маÑÑив, как и myArray
Удаление повÑоÑÑÑÑиеÑÑ ÑлеменÑов из маÑÑива
const numbers = [2, 3, 4, 4, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 5, 32, 3, 4, 5];
console.log([...new Set(numbers)]); // [2, 3, 4, 5, 6, 7, 32]
СвÑÐ·Ñ Ñо ÑÑÑоками
// ЧÑвÑÑвиÑелÑноÑÑÑ Ðº ÑегиÑÑÑÑ (коллекÑÐ¸Ñ Ð±ÑÐ´ÐµÑ ÑодеÑжаÑÑ "F" и "f")
new Set("Firefox"); // Set(7) [ "F", "i", "r", "e", "f", "o", "x" ]
// ÐÑопÑÑк дÑбликаÑов ("f" вÑÑÑеÑаеÑÑÑ Ð´Ð²Ð° Ñаза в ÑÑÑоке, но в коллекÑии бÑÐ´ÐµÑ ÑолÑко один Ñаз)
new Set("firefox"); // Set(6) [ "f", "i", "r", "e", "o", "x" ]
ÐÑполÑзÑйÑе Set Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи ÑпиÑка знаÑений
const array = Array.from(document.querySelectorAll("[id]")).map((e) => e.id);
const set = new Set(array);
console.assert(set.size === array.length);
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4