Когда я раньше изучал ES6, я увиделSet
а такжеMap
, я не знаю, каковы его сценарии применения, я просто думаю, что он будет использоваться в дедупликации массива и хранении данных, и я постепенно понял это позже.Set
представляет собой структуру данных, называемую коллекцией,Map
представляет собой структуру данных, называемую словарем.
Эта статья была включена в github:GitHub.com/Майкл-Ли Чжиган…
Set
Set
сам по себе является конструктором, используемым для генерацииSet
структура данных.Set
Функции могут принимать массив (или другую структуру данных с итерируемым интерфейсом) в качестве параметра для инициализации.Set
Объекты позволяют хранить значения любого типа, будь то примитивное значение или ссылка на объект. Он похож на массив, но все значения членов уникальны и нет повторяющихся значений.
const s = new Set()
[2, 3, 5, 4, 5, 2, 2].forEach((x) => s.add(x))
for (let i of s) {
console.log(i)
}
// 2 3 5 4
Специальные значения в Set
Set
Значение, хранимое объектом, всегда уникально, поэтому необходимо определить, идентичны ли два значения. Есть несколько особых значений, требующих особого обращения:
- +0 и -0 идентичны при сохранении уникальности суждения, поэтому они не повторяются
-
undefined
а такжеundefined
идентичен, поэтому не повторяется -
NaN
а такжеNaN
не идентичны, но вSet
думать вNaN
а такжеNaN
Равно, все может существовать только одно, не повторяющееся.
Свойства набора:
-
size
: возвращает количество элементов, содержащихся в коллекции
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5])
items.size // 5
Методы объектов экземпляра Set
-
add(value)
: добавить значение, вернутьсяSet
Сама структура (которую можно связать). -
delete(value)
: удалить значение, успешно удалить и вернутьсяtrue
, иначе возвратfalse
. -
has(value)
: возвращает логическое значение, указывающее, является ли значениеSet
член. -
clear()
: очистить все члены, без возвращаемого значения.
s.add(1).add(2).add(2)
// 注意2被加入了两次
s.size // 2
s.has(1) // true
s.has(2) // true
s.has(3) // false
s.delete(2)
s.has(2) // false
метод обхода
-
keys()
: возвращает итератор имен ключей. -
values()
: возвращает итератор ключевых значений. -
entries()
: возвращает итератор пар ключ-значение. -
forEach()
: Используйте функцию обратного вызова для перебора каждого члена.
из-заSet
Структура не имеет имени ключа, только значение ключа (или имя ключа и значение ключа являются одним и тем же значением), поэтомуkeys
Методы иvalues
Поведение метода точно такое же.
let set = new Set(['red', 'green', 'blue'])
for (let item of set.keys()) {
console.log(item)
}
// red
// green
// blue
for (let item of set.values()) {
console.log(item)
}
// red
// green
// blue
for (let item of set.entries()) {
console.log(item)
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
Массив против набора
-
Array
изindexOf
коэффициент методаSet
изhas
метод неэффективен -
Set
Не содержит повторяющихся значений (вы можете использовать эту функцию для дедупликации массива) -
Set
пройти черезdelete
метод удаляет значение, аArray
только черезsplice
. Простота использования двух лучше первого -
Array
множество новых методовmap
,filter
,some
,every
ждатьSet
Нет (но может использоваться путем преобразования двух друг в друга)
Применение набора
1,Array.from
метод может бытьSet
Структура преобразуется в массив.
const items = new Set([1, 2, 3, 4, 5])
const array = Array.from(items)
2. Дедупликация массива
// 去除数组的重复成员
;[...new Set(array)]
Array.from(new Set(array))
3. Массивmap
а такжеfilter
методы также могут быть использованы косвенноSet
let set = new Set([1, 2, 3])
set = new Set([...set].map((x) => x * 2))
// 返回Set结构:{2, 4, 6}
let set = new Set([1, 2, 3, 4, 5])
set = new Set([...set].filter((x) => x % 2 == 0))
// 返回Set结构:{2, 4}
4. Реализовать союз(Union)
, перекресток(Intersect)
сумма и разница
let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
// 并集
let union = new Set([...a, ...b])
// Set {1, 2, 3, 4}
// 交集
let intersect = new Set([...a].filter((x) => b.has(x)))
// set {2, 3}
// 差集
let difference = new Set([...a].filter((x) => !b.has(x)))
// Set {1}
weakSet
WeakSet
структура иSet
Точно так же это также набор уникальных значений.
- Членами являются массивы и массивоподобные объекты, если они вызываются
add()
Ошибка возникает, когда методу передается параметр объекта, не являющийся массивом или похожий на массив.
const b = [1, 2, [1, 2]]
new WeakSet(b) // Uncaught TypeError: Invalid value used in weak set
- Все члены являются слабыми ссылками, которые могут быть переработаны механизмом сборки мусора и могут использоваться для сохранения узлов DOM, что не так просто вызвать утечку памяти.
-
WeakSet
не является итерируемым и, следовательно, не может использоваться вfor-of
цикл ожидания. -
WeakSet
нетsize
Атрибуты.
Map
Map
хранится вkey-value
пары ключ-значение формыkey
а такжеvalue
Может быть любого типа, т.е. объекты также могут использоваться какkey
.Map
Появление , позволяет использовать различные типы значений в качестве ключей.Map
То, что обеспечено, является соответствием «значение-значение».
Разница между картой и объектом
-
Object
У объекта есть прототип, а значит у него есть дефолтkey
Значение находится на объекте, если мы не используемObject.create(null)
Создать объект без прототипа; - существует
Object
объект, толькоString
а такжеSymbol
так какkey
значение, но вMap
середина,key
Значения могут быть любого примитивного типа (String
,Number
,Boolean
,undefined
,NaN
....), или объект (Map
,Set
,Object
,Function
,Symbol
,null
….); - пройти через
Map
серединаsize
свойства, которые можно легко получитьMap
длина, чтобы получитьObject
Длину можно только рассчитать вручную
Свойства карты
- размер: возвращает количество элементов, содержащихся в коллекции
const map = new Map()
map.set('foo', ture)
map.set('bar', false)
map.size // 2
Методы объекта Карта
-
set(key, val)
: КMap
добавить новые элементы -
get(key)
: найти конкретное значение по ключевому значению и вернуть -
has(key)
: судитьMap
Есть ли у объектаKey
Соответствующее значение, есть возвратtrue
, иначе возвратfalse
-
delete(key)
: по ключевому значению отMap
Удалить соответствующие данные из -
clear()
: положи этоMap
удалить все элементы в
const m = new Map()
const o = { p: 'Hello World' }
m.set(o, 'content')
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
метод обхода
-
keys()
: возвращает обходчик имен ключей -
values()
: итератор, который возвращает значение ключа -
entries()
: возвращает итератор пар ключ-значение. -
forEach()
: цикл по каждому элементу с использованием функции обратного вызова
const map = new Map([
['a', 1],
['b', 2],
])
for (let key of map.keys()) {
console.log(key)
}
// "a"
// "b"
for (let value of map.values()) {
console.log(value)
}
// 1
// 2
for (let item of map.entries()) {
console.log(item)
}
// ["a", 1]
// ["b", 2]
// 或者
for (let [key, value] of map.entries()) {
console.log(key, value)
}
// "a" 1
// "b" 2
// for...of...遍历map等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value)
}
// "a" 1
// "b" 2
преобразование типа данных
Сопоставить с массивом
let map = new Map()
let arr = [...map]
Массив для карты
Map: map = new Map(arr)
Сопоставить с объектом
let obj = {}
for (let [k, v] of map) {
obj[k] = v
}
Объект на карте
for( let k of Object.keys(obj)){
map.set(k,obj[k])
}
Приложение карты
В некоторых проектах администратора мы обычно отображаем личную информацию, например, отображаем следующую информацию на странице. Традиционный метод заключается в следующем.
<div class="info-item">
<span>姓名</span>
<span>{{info.name}}</span>
</div>
<div class="info-item">
<span>年龄</span>
<span>{{info.age}}</span>
</div>
<div class="info-item">
<span>性别</span>
<span>{{info.sex}}</span>
</div>
<div class="info-item">
<span>手机号</span>
<span>{{info.phone}}</span>
</div>
<div class="info-item">
<span>家庭住址</span>
<span>{{info.address}}</span>
</div>
<div class="info-item">
<span>家庭住址</span>
<span>{{info.duty}}</span>
</div>
js-код
mounted() {
this.info = {
name: 'jack',
sex: '男',
age: '28',
phone: '13888888888',
address: '广东省广州市',
duty: '总经理'
}
}
Мы преобразовываем его через карту, сохраняем метку и значение, которое нам нужно отобразить на нашей карте, и отображаем его на странице, что сокращает объем html-кода.
<template>
<div id="app">
<div class="info-item" v-for="[label, value] in infoMap" :key="value">
<span>{{label}}</span>
<span>{{value}}</span>
</div>
</div>
</template>
js-код
data: () => ({
info: {},
infoMap: {}
}),
mounted () {
this.info = {
name: 'jack',
sex: '男',
age: '28',
phone: '13888888888',
address: '广东省广州市',
duty: '总经理'
}
const mapKeys = ['姓名', '性别', '年龄', '电话', '家庭地址', '身份']
const result = new Map()
let i = 0
for (const key in this.info) {
result.set(mapKeys[i], this.info[key])
i++
}
this.infoMap = result
}
WeakMap
WeakMap
структура иMap
Аналогичный по структуре, он также используется для создания набора пар ключ-значение.
- принимает только объекты в качестве имен ключей (
null
кроме), другие типы значений не принимаются в качестве имен ключей - Имя ключа является слабой ссылкой, значение ключа может быть произвольным, объект, на который указывает имя ключа, может быть удален сборщиком мусора, а имя ключа в настоящее время недопустимо.
- не может быть пройдено, методы
get
,set
,has
,delete
Суммировать
Set
- представляет собой структуру данных, называемую коллекцией (новое в ES6)
- Члены являются уникальными, неупорядоченными и неповторяющимися
-
[value, value]
, значение ключа совпадает с именем ключа (или только значением ключа, без имени ключа) - Позволяет хранить уникальные значения любого типа, будь то примитивы или ссылки на объекты
- Его можно пройти следующими способами:
add
,delete
,has
,clear
WeakSet
- члены являются объектами
- Члены являются слабыми ссылками, которые могут быть переработаны механизмом сборки мусора и могут использоваться для сохранения
DOM
Узлы, не легко вызвать утечку памяти - не может быть пройдено, методы
add
,delete
,has
Map
- представляет собой словарную структуру данных, по сути, набор пар ключ-значение
- Может быть пройден, может быть преобразован с различными форматами данных
- Методы операции:
set
,get
,has
,delete
,clear
WeakMap
- принимает только объекты в качестве имен ключей (
null
кроме), другие типы значений не принимаются в качестве имен ключей - Имя ключа является слабой ссылкой, значение ключа может быть произвольным, объект, на который указывает имя ключа, может быть удален сборщиком мусора, а имя ключа в настоящее время недопустимо.
- не может быть пройдено, методы
get
,set
,has
,delete
рекомендуемая статья
Подпишитесь на мою официальную учетную запись, чтобы время от времени делиться передовыми знаниями и добиваться прогресса вместе с вами!