Fuzzyma
La forma de la vieja escuela de sumar todos los valores de una matriz en el Set
es:
// for the sake of this example imagine this set was created somewhere else
// and I cannot construct a new one out of an array
let mySet = new Set()
for(let item of array) {
mySet.add(item)
}
¿Hay una forma más elegante de hacer esto? Quizás mySet.add(array)
o mySet.add(...array)
?
PD: Sé que ambos no funcionan
amankkg
Tiempo Set
La API sigue siendo muy minimalista, puedes usar Array.prototype.forEach
y acorta un poco tu código:
array.forEach(item => mySet.add(item))
// alternative, without anonymous arrow function
array.forEach(mySet.add, mySet)
-
No creo que esto sea realmente mejor que un simple
for of
círculo. El segundo especialmente es mucho más confuso.– Timmmmm
15 mayo 2020 a las 13:50
-
Me gusta como API deficiente fue llamado minimalista!
– ruX
19 de julio de 2020 a las 18:58
-
¿Por qué necesitamos el segundo argumento en: array.forEach(mySet.add, mySet) ?
– ed22
19 oct 2020 a las 13:02
-
@ ed22 ver para cada documentos:
thisArg
(opcional) – valor para usar comothis
al ejecutar llamar de vuelta– amankkg
20 oct 2020 a las 16:06
-
@amankkg Nunca me acostumbraré al hecho de que mySet.add no usa el contexto del objeto antes del punto, sino que es como un método completamente separado.
– ed22
26 oct 2020 a las 10:40
Aquí hay una forma funcional, devolviendo un nuevo conjunto:
const set = new Set(['a', 'b', 'c'])
const arr = ['d', 'e', 'f']
const extendedSet = new Set([ ...set, ...arr ])
// Set { 'a', 'b', 'c', 'd', 'e', 'f' }
-
Con este enfoque, termino teniendo conjuntos y matrices anidados de varios niveles, no un conjunto aplanado
-Paulo Neves
4 de enero de 2020 a las 13:22
-
@PauloNeves suena como si no estuvieras usando la sintaxis extendida
...
– julián
5 de enero de 2020 a las 15:12
Este es en mi opinión el más elegante.
// for a new Set
const x = new Set([1,2,3,4]);
// for an existing Set
const y = new Set();
[1,2,3,4].forEach(y.add, y);
-
Otro elegante!
– Fuzzyma
22 de noviembre de 2019 a las 14:38
-
forEach es ~200 veces más lento que iterar a través de una matriz. Está bien para algunos valores, pero ten cuidado si esto es algo que haces todo el tiempo. stackoverflow.com/q/43821759/491553
– Ryan Shillington
13 de noviembre de 2020 a las 19:55
-
@RyanShillington no es cierto, solía serlo, pero los navegadores se han optimizado mucho desde que se publicó esa respuesta. ver jsben.ch/fxaYy (el crédito es para @Redu)
– WiR3D
23 de noviembre de 2020 a las 15:21
-
@WiR3D Bueno, santa mierda. Esa es una noticia increíble.
– Ryan Shillington
24 de noviembre de 2020 a las 14:32
¿Qué tal usar el operador de distribución para combinar fácilmente los nuevos elementos de su matriz en un conjunto existente?
const mySet = new Set([1,2,3,4])
const additionalSet = [5,6,7,8,9]
mySet = new Set([...mySet, ...additionalSet])
JHH
También puedes usar Array.reduce()
:
const mySet = new Set();
mySet.add(42); // Just to illustrate that an existing Set is used
[1, 2, 3].reduce((s, e) => s.add(e), mySet);
-
Usando
reduce
no tiene sentido aquí cuando todo lo que necesita es la iteración deforEach
. Vea la respuesta de @ WiR3D.– Paul Irlandés
3 de diciembre de 2019 a las 19:58
-
Realmente no entiendo tu objeción. A veces, desea una solución de declaración única, como en una lambda donde no desea un bloque de llaves, o en una inicialización. Tiempo
reduce
puede no ser la opción más obvia, no veo cómo no “tiene sentido”: está reduciendo una matriz a otra cosa, un Conjunto, que es exactamente lo quereduce
está destinado a.– JHH
10 de diciembre de 2020 a las 12:16
-
Yo diría que lo estás mapeando, no reduciéndolo aquí.
– Sean Morris
9 de abril de 2021 a las 8:19
-
@JHH El punto es que
[1, 2, 3].forEach(e => mySet.add(e))
ofor (const e of [1, 2, 3]) mySet.add(e)
tendría más sentido.– CherryDT
7 sep 2021 a las 7:28
-
@CherryDT Creo que tenemos que estar de acuerdo en estar en desacuerdo sobre lo que significa tener sentido. Personalmente, no elegiría la solución de reducción, pero la agregué como una opción. 19 personas sorprendidas piensan que no “tiene sentido”.
– JHH
15 de septiembre de 2021 a las 14:27
crear un nuevo conjunto:
//Existing Set
let mySet = new Set([1,2,3,4,5]);
//Existing Array
let array = [6,7,8,9,0];
mySet = new Set(array.concat([...mySet]));
console.log([...mySet]);
//or single line
console.log([...new Set([6,7,8,9,0].concat([...new Set([1,2,3,4,5])]))]);
-
Usando
reduce
no tiene sentido aquí cuando todo lo que necesita es la iteración deforEach
. Vea la respuesta de @ WiR3D.– Paul Irlandés
3 de diciembre de 2019 a las 19:58
-
Realmente no entiendo tu objeción. A veces, desea una solución de declaración única, como en una lambda donde no desea un bloque de llaves, o en una inicialización. Tiempo
reduce
puede no ser la opción más obvia, no veo cómo no “tiene sentido”: está reduciendo una matriz a otra cosa, un Conjunto, que es exactamente lo quereduce
está destinado a.– JHH
10 de diciembre de 2020 a las 12:16
-
Yo diría que lo estás mapeando, no reduciéndolo aquí.
– Sean Morris
9 de abril de 2021 a las 8:19
-
@JHH El punto es que
[1, 2, 3].forEach(e => mySet.add(e))
ofor (const e of [1, 2, 3]) mySet.add(e)
tendría más sentido.– CherryDT
7 sep 2021 a las 7:28
-
@CherryDT Creo que tenemos que estar de acuerdo en estar en desacuerdo sobre lo que significa tener sentido. Personalmente, no elegiría la solución de reducción, pero la agregué como una opción. 19 personas sorprendidas piensan que no “tiene sentido”.
– JHH
15 de septiembre de 2021 a las 14:27
Solo publíquelo aquí para inspirarse. Crear una clase que amplíe Set y agregue un método addRange.
class MegaSet extends Set {
constructor(iterable) {
super(iterable);
}
addRange(range) {
for (var elem of range) {
this.add(elem);
}
}
}
const array = [1,2,3,5,5,6];
let mySet = new MegaSet([1,2,3,4]);
mySet.addRange(array);
console.log([...mySet]);
-
Las respuestas generalmente son mejores si incluyen texto que explica el código incluido. También le pueden interesar las respuestas de ¿Por qué la extensión de objetos nativos es una mala práctica?.
– Mono hereje
15 de junio de 2018 a las 20:14
-
No estas equivocado. Actualicé mi código con una posible solución… incluso si en este caso específico, el conjunto ya está instanciado.
– Thomas-Louis Simard
15 de junio de 2018 a las 20:27
-
Si extendiera el prototipo de manera segura, ese es el mejor enfoque en mi humilde opinión (como lo hizo antes de que Mike publicara el enlace donde dice que a menudo está bien)
– baao
15/06/2018 a las 20:33
Hay una propuesta de etapa 1 para
Set.prototype.addAll
–Yuri Tarabanko
15 de junio de 2018 a las 19:17
@YuryTarabanko Es un poco extraño por qué no se incluyó en
Set#add
en primer lugar. Alguien debe haber pensadoArray#push
tomar múltiples argumentos es algo malo.– Roberto
1 de abril de 2020 a las 12:33
¿No puedes usar el constructor de conjuntos? Ver desarrollador.mozilla.org/en-US/docs/Web/JavaScript/Reference/… en Relación con objetos de matriz.
– Verdadera Voluntad
18 mayo 2020 a las 17:45
ah, cuando tenemos arr.push(…items) ¿por qué set.add(value) : / . Me tropecé con esto recientemente. Mal diseño de API
– Sainath SR
2 abr 2021 a las 17:12