Matriz JavaScript para establecer

145

MSDN hace referencia a la abstracción de la colección Set de JavaScript . Tengo una serie de objetos que me gustaría convertir en un conjunto para poder eliminar ( .delete()) varios elementos por nombre:

var array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

¿Cómo convierto esta matriz en un conjunto? Más específicamente, ¿es posible hacer esto sin iterar sobre la matriz anterior? La documentación es relativamente escasa (suficiente para conjuntos instanciados; no para conversiones, si es posible).

También puedo estar pensando en la conversión a un Mapa , para su eliminación por clave. Lo que estoy tratando de lograr es una colección iterable a la que se puede acceder o modificar a través del acceso a los elementos principalmente a través de una clave (a diferencia del índice).

La conversión de una matriz a otra es el objetivo final.

Thomas
fuente
1
suena como un objeto antiguo llano trabajarán para usted ...
dandavis
3
@Thomas: así que me falta algo que quiero aprender. ¿Cuál es la diferencia entre var s = new Set (), agregar objetos y emitir s.delete (lo que sea) - y var o = {1: 'aaa', 2: 'bbbb' ...} y emitir delete (o [ '1'])?
Veverke
1
@Veverke que fue más descriptivo que tu comentario inicial (+1). Gracias. Pero, de nuevo, ¿es posible hacer eso sin iterar sobre la matriz para agregar los contenidos de la matriz al objeto y retener una lista como estructura accesible con clave? Parece que tienes una idea. No me importaría verlo en un formato de respuesta si tienes tiempo para elaborarlo.
Thomas
2
Ese objeto de matriz no es legal, ya {"bob", "dole"}que no es un objeto válido.
Alnitak
1
@Veverke ES6 Sety Mapson una implementación "pura" de esas construcciones de datos que no sufren los problemas que Objectpueden cuando se agregan cosas a su prototipo.
Alnitak

Respuestas:

206

Simplemente pase la matriz al constructor Set. El constructor Set acepta un iterableparámetro. El objeto Array implementa el iterableprotocolo, por lo que es un parámetro válido.

var arr = [55, 44, 65];
var set = new Set(arr);
console.log(set.size === arr.length);
console.log(set.has(65));

Mira aquí

levi
fuente
estrictamente correcto, aunque he dudado en agregar una respuesta yo mismo ya que los datos del OP están mal formados y, por lo tanto, no está claro exactamente qué espera
Alnitak
10
Esto no funciona en IE11. No es compatible con este constructor. Lo evitaría a menos que sepa qué navegadores van a utilizar sus usuarios.
Eric
10

Si comienzas con:

let array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

Y quieres un conjunto de, por ejemplo, nombres, harías:

let namesSet = new Set(array.map(item => item.name));
Ryan Shillington
fuente
3

Lo que dijo Levi sobre pasarlo al constructor es correcto, pero también podría usar un objeto.

Creo que lo que Veverke está tratando de decir es que podría usar fácilmente la deletepalabra clave en un objeto para lograr el mismo efecto.

Creo que estás confundido por la terminología; las propiedades son componentes del objeto que puede usar como índices con nombre (si quiere pensarlo de esa manera).

Intenta algo como esto:

var obj = {
    "bob": "dole",
    "mr.": "peabody",
    "darkwing": "duck"
};

Entonces, podrías hacer esto:

delete obj["bob"];

La estructura del objeto sería entonces esta:

{
    "mr.": "peabody",
    "darkwing": "duck"
}

Lo que tiene el mismo efecto.

AstroCB
fuente
1
Gracias Astro :-). De hecho, esto abrió la pregunta: "¿cuál es la diferencia entre un objeto Set y un objeto simple"? Aunque, como he señalado en los comentarios anteriores, "Establecer" es un tipo de cierre que ofrece la funcionalidad "agradable de tener" de "borrar".
Veverke
En resumen, creo que el título de la publicación debería cambiarse a "¿Cuál es la diferencia entre un objeto Set y un objeto simple en JavaScript?", Y tenga en cuenta que "Al tratar de lograr esto y aquello ... terminé preguntándome a mí mismo ¿
Cuál
@Veverke "cuál es la diferencia entre un objeto Set y un objeto simple", podría leer el documento ..
Hacketo
1
@Hacketo: ¿encuentra alguna otra que Set que proporcione "Clear" en su api?
Veverke
1
Esta es una respuesta interesante: piense que garantiza más crédito del que ha recibido. Me hizo pensar. ¡Gracias!
Thomas
2

Por definición, "Un conjunto es una colección de valores, donde cada valor puede aparecer solo una vez". Entonces, si su matriz tiene valores repetidos, entonces solo se agregará un valor entre los valores repetidos a su Conjunto.

var arr = [1, 2, 3];
var set = new Set(arr);
console.log(set); // {1,2,3}


var arr = [1, 2, 1];
var set = new Set(arr);
console.log(set); // {1,2}

Por lo tanto, no convierta a conjunto si tiene valores repetidos en su matriz.

Ashlesh Sortee
fuente