Массив JavaScript для установки


145

MSDN ссылается на абстракцию Set коллекции JavaScript . У меня есть массив объектов, которые я хотел бы преобразовать в набор, чтобы я мог удалить ( .delete()) различные элементы по имени:

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

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

Я также могу подумать о преобразовании в карту для удаления по ключу. То, что я пытаюсь сделать, - это итеративная коллекция, к которой можно получить доступ или изменить ее, получая доступ к элементам в основном через ключ (в отличие от индекса).

Преобразование из массива в другой является конечной целью.


1
звучит так, как будто старый
добрый

3
@ Томас: так что мне не хватает чего-то, чему я хочу научиться. В чем разница между 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могут возникнуть при добавлении вещей в его прототип.
Альнитак

Ответы:


206

Просто передайте массив конструктору 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» - это заключительный тип, который предлагает «приятно иметь функциональность» «clear».
Веверке

Короче говоря, я думаю, что заголовок поста должен быть изменен на «В чем разница между объектом 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}

Так что не конвертируйте в set, если у вас есть повторяющиеся значения в вашем массиве.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.