Есть ли простой способ объединить карты ES6 вместе (как Object.assign
)? И в то время как мы на этом, как насчет наборов ES6 (как Array.concat
)?
javascript
set
ecmascript-6
jameslk
источник
источник
for..of
потому что этоkey
может быть любой типОтветы:
Для наборов:
Для карт:
Обратите внимание, что если несколько карт имеют один и тот же ключ, значением объединенной карты будет значение последней карты слияния с этим ключом.
источник
Map
: «Конструктор:new Map([iterable])
», «iterable
это массив или другой итерируемый объект, элементами которого являются пары ключ-значение (двухэлементные массивы). Каждая пара ключ-значение добавляется на новую карту ». - просто как ссылка.Map
конструктору позволяет избежать потребления памяти.Вот мое решение с использованием генераторов:
Для карт:
Для наборов:
источник
m2.forEach((k,v)=>m1.set(k,v))
если вы хотите легкую поддержку браузераПо причинам, которые я не понимаю, вы не можете напрямую добавлять содержимое одного набора в другой с помощью встроенной операции. Такие операции, как объединение, пересечение, объединение и т. Д., Являются довольно простыми операциями над множествами, но не являются встроенными. К счастью, вы можете довольно легко построить все это самостоятельно.
Таким образом, для реализации операции слияния (слияния содержимого одного набора в другой или одной карты в другую) вы можете сделать это одной
.forEach()
строкой:И, для
Map
, вы можете сделать это:Или в синтаксисе ES6:
К вашему сведению, если вы хотите простой подкласс встроенного
Set
объекта, который содержит.merge()
метод, вы можете использовать это:Предполагается, что он находится в своем собственном файле setex.js, который вы можете затем использовать
require()
в node.js и использовать вместо встроенного Set.источник
new Set(s, t)
. работает.t
Параметр игнорируется. Кроме того, очевидно, что нецелесообразноadd
обнаруживать тип его параметра и, если набор добавляет элементы набора, потому что тогда не было бы способа добавить сам набор в набор..add()
метода получения набора, я понимаю вашу точку зрения. Я просто нахожу это гораздо менее полезным, чем возможность комбинировать наборы с использованием,.add()
поскольку у меня никогда не было необходимости в наборе или наборах, но мне приходилось много раз объединять наборы. Просто вопрос о полезности одного поведения против другого.n.forEach(m.add, m)
- это инвертирует пары ключ / значение!Map.prototype.forEach()
иMap.prototype.set()
изменили аргументы. Похоже на недосмотр кого-то. Это заставляет больше кода при попытке использовать их вместе.set
Порядок параметров является естественным для пар ключ / значение,forEach
выровнен по методуArray
sforEach
(и тому подобное$.each
или_.each
также перечисляет объекты).Оригинальный ответ
Я хотел бы предложить другой подход, используя
reduce
иspread
оператор:Реализация
Использование:
Наконечник:
Мы также можем использовать
rest
оператор, чтобы сделать интерфейс немного лучше:Теперь вместо передачи массива множеств мы можем передать произвольное количество аргументов множеств:
источник
forof
сadd
, что кажется просто очень неэффективным. Я действительно хочуaddAll(iterable)
метод на множествахfunction union<T> (...iterables: Array<Set<T>>): Set<T> { const set = new Set<T>(); iterables.forEach(iterable => { iterable.forEach(item => set.add(item)) }) return set }
Утвержденный ответ отличный, но каждый раз он создает новый набор.
Если вы хотите вместо этого изменить существующий объект, используйте вспомогательную функцию.
Устанавливать
Использование:
карта
Использование:
источник
Чтобы объединить наборы в массиве Sets, вы можете сделать
Мне немного загадочно, почему следующее, что должно быть эквивалентно, терпит неудачу по крайней мере в Вавилоне:
источник
Array.from
принимает дополнительные параметры, второй является функцией отображения.Array.prototype.map
передает три аргумента в свой обратный вызов:,(value, index, array)
так что он эффективно вызываетSets.map((set, index, array) => Array.from(set, index, array)
. Очевидно,index
что это число, а не функция отображения, поэтому оно не работает.Основываясь на ответе Асафа Каца, вот машинописная версия:
источник
Не имеет смысла вызывать
new Set(...anArrayOrSet)
при добавлении нескольких элементов (из массива или другого набора) в существующий набор .Я использую это в
reduce
функции, и это просто глупо. Даже если у вас есть...array
доступный оператор распространения, вы не должны использовать его в этом случае, так как он тратит ресурсы процессора, памяти и времени.Демо-фрагмент
источник
Преобразуйте наборы в массивы, сгладьте их и, наконец, конструктор будет унифицирован.
источник
Нет, для них нет встроенных операций, но вы можете легко создать их самостоятельно:
источник
пример
использование
источник
Вы можете использовать синтаксис распространения, чтобы объединить их вместе:
источник
объединить с картой
источник