Tablica JavaScript do ustawienia

145

MSDN odwołuje się do abstrakcji zbioru zestawu JavaScript . Mam tablicę obiektów, które chciałbym przekonwertować na zestaw, aby móc usunąć ( .delete()) różne elementy według nazwy:

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

Jak przekonwertować tę tablicę na zestaw? Dokładniej, czy można to zrobić bez iteracji po powyższej tablicy? Dokumentacja jest stosunkowo niewystarczająca (wystarczająca dla zestawów utworzonych; nie dla konwersji - jeśli to możliwe).

Być może myślę również o konwersji na mapę do usunięcia za pomocą klucza. To, co próbuję osiągnąć, to iterowalna kolekcja, do której można uzyskać dostęp lub zmodyfikować ją, uzyskując dostęp do elementów głównie za pomocą klucza (w przeciwieństwie do indeksu).

Ostatecznym celem jest konwersja z tablicy na drugą.

Tomasz
źródło
1
brzmi jak zwykły stary obiekt, który będzie dla ciebie działał ...
dandavis
3
@ Thomas: więc brakuje mi czegoś, czego chcę się nauczyć. Jaka jest różnica między var s = new Set (), dodawaniem obiektów i wydawaniem s.delete (cokolwiek) - i var o = {1: 'aaa', 2: 'bbbb' ...} a wydaniem polecenia delete (o [ „1”])?
Veverke
1
@Veverke, który był bardziej opisowy niż Twój pierwszy komentarz (+1). Dziękuję Ci. Ale znowu, czy można to zrobić bez iteracji po tablicy w celu dodania zawartości tablicy do obiektu i zachowania listy podobnej do struktury dostępnej za pomocą klucza? Wygląda na to, że masz pomysł. Nie miałbym nic przeciwko zobaczeniu tego w formacie odpowiedzi, jeśli masz czas na rozwinięcie.
Thomas
2
Ten obiekt tablicy jest nieprawidłowy, ponieważ {"bob", "dole"}nie jest prawidłowym obiektem.
Alnitak
1
@Veverke ES6 Seti Mapsą „czystą” implementacją tych konstrukcji danych, które nie cierpią z powodu problemów, które Objectmogą, gdy coś jest dodawane do jego prototypu.
Alnitak

Odpowiedzi:

204

Po prostu przekaż tablicę do konstruktora Set. Konstruktor Set akceptuje iterableparametr. Obiekt Array implementuje iterableprotokół, więc jest prawidłowym parametrem.

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

Spójrz tutaj

levi
źródło
ściśle poprawne, chociaż wahałem się przed dodaniem odpowiedzi, ponieważ dane OP są zniekształcone i dlatego nie jest jasne, czego dokładnie oczekuje
Alnitak
10
To nie działa w IE11. Nie obsługuje tego konstruktora. Unikałbym tego, chyba że wiesz, z jakich przeglądarek będą korzystać Twoi użytkownicy.
Eric
10

Jeśli zaczynasz od:

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

I chcesz zestaw, powiedzmy, imion, zrobiłbyś:

let namesSet = new Set(array.map(item => item.name));
Ryan Shillington
źródło
3

To, co Levi powiedział o przekazaniu go do konstruktora, jest poprawne, ale można też użyć obiektu.

Myślę, że Veverke próbuje powiedzieć, że można łatwo użyć deletesłowa kluczowego na obiekcie, aby osiągnąć ten sam efekt.

Myślę, że jesteś zdezorientowany terminologią; właściwości to komponenty obiektu, których możesz używać jako nazwanych indeksów (jeśli chcesz o tym myśleć w ten sposób).

Spróbuj czegoś takiego:

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

Następnie możesz po prostu zrobić to:

delete obj["bob"];

Struktura obiektu wyglądałaby wtedy następująco:

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

Co ma ten sam efekt.

AstroCB
źródło
1
Dzięki Astro :-). Faktycznie, to otworzyło pytanie: "jaka jest różnica między obiektem Set a zwykłym obiektem"? Chociaż, jak zauważyłem w komentarzach powyżej, „Zestaw” jest typem zamykania, który oferuje „przyjemną dla oka funkcjonalność” „wyczyść”.
Veverke
Krótko mówiąc, myślę, że tytuł posta powinien zostać zmieniony na „Jaka jest różnica między obiektem Set a zwykłym obiektem w javascript” i zauważyć, że „Próbując osiągnąć to i tamto ... w końcu zadałem sobie pytanie jaka jest różnica między ...
Veverke
@Veverke „Jaka jest różnica między zestawem przedmiotu i zwykły przedmiot”, może po prostu przeczytać doc ..
Hacketo
1
@Hacketo: czy znajdujesz coś innego niż Set zapewniający „Clear” w swoim interfejsie API?
Veverke
1
To interesująca odpowiedź - myślę, że zasługuje na większy kredyt, niż otrzymał. Sprawił, że pomyślałem. Dziękuję Ci!
Thomas
2

Z definicji „Zbiór to zbiór wartości, z których każda może wystąpić tylko raz”. Tak więc, jeśli twoja tablica zawiera powtarzające się wartości, tylko jedna wartość spośród powtarzających się wartości zostanie dodana do twojego zestawu.

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}

Dlatego nie konwertuj na zestaw, jeśli masz powtarzające się wartości w tablicy.

Ashlesh Sortee
źródło