JavaScript-масив для встановлення


145

MSDN посилається на встановлення колекції абстракції JavaScript. У мене є масив об'єктів, які я хотів би перетворити на набір, щоб я міг видалити ( .delete()) різні елементи за назвою:

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

Як перетворити цей масив у набір? Більш конкретно, чи можна це зробити без повторення над вищевказаним масивом? Документації відносно бракує (достатньо для встановлених наборів; не для перетворень - якщо можливо).

Можливо, я також думаю про перетворення на карту для видалення за ключем. Я намагаюся зробити це ітерабельна колекція, до якої можна отримати доступ або змінити через доступ до елементів, головним чином, за допомогою ключа (на відміну від індексу).

Перетворення з масиву в інший є кінцевою метою.


1
звучить, як звичайний старий Об’єкт спрацює для вас ...
dandavis

3
@Thomas: тому мені щось не вистачає, чого я хочу навчитися. Яка різниця між var s = new Set (), додаванням об'єктів та видачею s.delete (що завгодно) - та var o = {1: 'aaa', 2: 'bbbb' ...} та видалення delete (o [ '1'])?
Веверке

1
@Veverke, що було більш описовим, ніж ваш початковий коментар (+1). Дякую. Але, знову ж, чи можливо це зробити без ітерації над масивом для додавання вмісту масиву до об'єкта та збереження списку на зразок ключової структури? Здається, у вас є ідея. Я б не проти бачити це у форматі відповідей, якщо у вас є час на детальну розробку.
Томас

2
Цей об'єкт масиву не є законним, оскільки {"bob", "dole"}не є дійсним об'єктом.
Альнітак

1
@Veverke ES6 Setі Mapє "чистою" реалізацією тих конструкцій даних, які не страждають від проблем, які Objectможуть, коли речі додаються до його прототипу.
Альнітак

Відповіді:


205

Просто передайте масив конструктору Set. Конструктор Set приймає iterableпараметр. Об'єкт Array реалізує iterableпротокол, тому його допустимий параметр.

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

Дивіться тут


строго правильно, хоча я вагаюся, щоб додати відповідь сам, оскільки дані ОП неправильно сформовані, і тому незрозуміло, що саме він очікує
Альнітак

10
Це не працює на IE11. Він не підтримує цей конструктор. Я б цього не уникав, якщо ви не знаєте, якими браузерами користуються ваші користувачі.
Ерік

10

Якщо ви почнете з:

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

І ви хочете, щоб набір, скажімо, імен, ви зробили б:

let namesSet = new Set(array.map(item => item.name));

3

Те, що сказали Леві про передачу його в конструктор, є правильним, але ви також можете використовувати об'єкт.

Я думаю, що те, що намагається сказати Веверке, - це те, що ти можеш легко використати deleteключове слово на об'єкті для досягнення того ж ефекту.

Я думаю, що вас бентежить термінологія; властивості - це компоненти об'єкта, які можна використовувати як названі індекси (якщо ви хочете продумати це таким чином).

Спробуйте щось подібне:

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

Тоді ви могли просто зробити це:

delete obj["bob"];

Структура об'єкта була б такою:

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

Що має той самий ефект.


1
Спасибі Астро :-). Дійсно, це відкрило питання: "в чому різниця між об'єктом Set і простим об'єктом"? Хоча, як я вже зазначав у коментарях вище, "Set" - це тип завершення, який пропонує "приємно мати функціональність" "ясно".
Веверке

Коротше кажучи, я думаю, що заголовок публікації слід змінити на "Яка різниця між об'єктом Set і звичайним об'єктом у javascript", і зауважте, що "намагаючись досягти цього і того ... я в кінцевому підсумку запитав себе в чому різниця між ...
Веверке

@Veverke "яка різниця між об'єктом Set і простим об'єктом", міг просто прочитати док ..
Hacketo

1
@Hacketo: чи знайдеш ти інше, ніж Set встановити "Clear" у своїх api?
Веверке

1
Це цікава відповідь - подумайте, що це вимагає більше кредиту, ніж отримано. Змусив мене думати. Дякую!
Томас

2

За визначенням "Набір - це сукупність значень, де кожне значення може виникати лише один раз". Отже, якщо ваш масив має повторені значення, то до вашого набору буде додано лише одне значення серед повторених значень.

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}

Отже, не перетворюйте на встановлені, якщо у вас в масиві є повторні значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.