JavaScript Array ที่จะตั้งค่า


161

MSDN อ้างถึงสิ่งที่เป็นนามธรรมของSet collection ของ JavaScript ฉันมีอาร์เรย์ของวัตถุที่ฉันต้องการแปลงเป็นชุดเพื่อให้ฉันสามารถลบ ( .delete()) องค์ประกอบต่างๆตามชื่อ:

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

ฉันจะแปลงอาร์เรย์นี้เป็นชุดได้อย่างไร โดยเฉพาะอย่างยิ่งเป็นไปได้ไหมที่จะทำสิ่งนี้โดยไม่ต้องวนซ้ำเหนืออาร์เรย์ด้านบน เอกสารประกอบค่อนข้างขาด (เพียงพอสำหรับชุดสร้างอินสแตนซ์ไม่ใช่สำหรับการแปลง - ถ้าเป็นไปได้)

ฉันอาจกำลังคิดถึงการแปลงเป็นแผนที่เพื่อลบทีละคีย์ สิ่งที่ฉันพยายามทำให้สำเร็จคือคอลเล็กชันที่ทำซ้ำได้ซึ่งสามารถเข้าถึงหรือแก้ไขได้โดยการเข้าถึงองค์ประกอบโดยใช้คีย์เป็นหลัก

การแปลงจากอาร์เรย์เป็นอีกเป้าหมายหนึ่งเป็นเป้าหมายสูงสุด


1
ดูเหมือนว่า Object เก่า ๆ จะใช้ได้ผลสำหรับคุณ ...
dandavis

3
@ โทมัส: ฉันขาดอะไรบางอย่างที่ฉันต้องการเรียนรู้ อะไรคือความแตกต่างระหว่าง var s = new Set () การเพิ่มวัตถุและการออก s.delete (อะไรก็ได้) - และ var o = {1: 'aaa', 2: 'bbbb' ... } และการออกการลบ (o [ '1'])?
Veverke

1
@Veverke ที่อธิบายได้มากกว่าความคิดเห็นเริ่มต้นของคุณ (+1) ขอบคุณ. แต่อีกครั้งเป็นไปได้หรือไม่ที่จะทำเช่นนั้นโดยไม่ต้องวนซ้ำบนอาร์เรย์เพื่อเพิ่มเนื้อหาของอาร์เรย์ไปยังวัตถุและเพื่อรักษารายการเช่นโครงสร้างที่สามารถเข้าถึงได้ด้วยคีย์ ดูเหมือนว่าคุณมีความคิด ฉันไม่รังเกียจที่จะเห็นมันในรูปแบบคำตอบหากคุณมีเวลาอธิบายอย่างละเอียด
โทมัส

2
วัตถุอาร์เรย์นั้นไม่ถูกกฎหมายเนื่องจาก{"bob", "dole"}ไม่ใช่วัตถุที่ถูกต้อง
Alnitak

1
@Veverke ES6 SetและMapเป็นการนำโครงสร้างข้อมูลที่ "บริสุทธิ์" ไปใช้โดยไม่ประสบปัญหาที่Objectสามารถทำได้เมื่อมีการเพิ่มสิ่งต่างๆลงในต้นแบบ
Alnitak

คำตอบ:


231

เพียงแค่ส่งอาร์เรย์ไปยัง Set constructor Set constructor ยอมรับiterableพารามิเตอร์ วัตถุ Array ใช้iterableโปรโตคอลดังนั้นจึงเป็นพารามิเตอร์ที่ถูกต้อง

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

ดูที่นี่


ถูกต้องอย่างเคร่งครัดแม้ว่าฉันจะลังเลที่จะเพิ่มคำตอบด้วยตัวเองเนื่องจากข้อมูลของ OP ผิดรูปแบบและดังนั้นจึงไม่ชัดเจนว่าเขาคาดหวังอะไร
Alnitak

10
สิ่งนี้ใช้ไม่ได้กับ IE11 ไม่สนับสนุนตัวสร้างนี้ ฉันจะหลีกเลี่ยงมันเว้นแต่คุณจะรู้ว่าผู้ใช้ของคุณจะใช้เบราว์เซอร์ใด
Eric

15

หากคุณเริ่มต้นด้วย:

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

สิ่งที่ลีวาย พูดเกี่ยวกับการส่งผ่านเข้าไปในคอนสตรัคเตอร์นั้นถูกต้อง แต่คุณสามารถใช้อ็อบเจกต์ได้ด้วย

ฉันคิดว่าสิ่งที่Veverkeพยายามจะพูดคือคุณสามารถใช้deleteคีย์เวิร์ดกับวัตถุเพื่อให้ได้เอฟเฟกต์เดียวกันได้อย่างง่ายดาย

ฉันคิดว่าคุณสับสนกับคำศัพท์ คุณสมบัติคือส่วนประกอบของออบเจ็กต์ที่คุณสามารถใช้เป็นดัชนีที่มีชื่อ (หากคุณต้องการคิดอย่างนั้น)

ลองทำสิ่งนี้:

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

จากนั้นคุณสามารถทำได้:

delete obj["bob"];

โครงสร้างของวัตถุจะเป็นดังนี้:

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

ซึ่งมีผลเช่นเดียวกัน.


1
ขอบคุณ Astro :-) อันที่จริงสิ่งนี้ทำให้เกิดคำถาม: "อะไรคือความแตกต่างระหว่างวัตถุ Set และวัตถุธรรมดา" แม้ว่าตามที่ฉันได้ระบุไว้ในความคิดเห็นด้านบน "Set" เป็นประเภทสรุปที่นำเสนอฟังก์ชัน "nice to have" ของ "clear"
Veverke

ในระยะสั้นฉันคิดว่าชื่อของโพสต์ควรเปลี่ยนเป็น "อะไรคือความแตกต่างระหว่าง Set object กับวัตถุธรรมดาใน javascript" และสังเกตว่า "ในการพยายามบรรลุสิ่งนี้และสิ่งนั้น ... ฉันถามตัวเองว่า อะไรคือความแตกต่างระหว่าง ...
Veverke

@Veverke "อะไรคือความแตกต่างระหว่าง Set object กับวัตถุธรรมดา" สามารถอ่านเอกสารได้ ..
Hacketo

1
@Hacketo: คุณพบสิ่งอื่นนอกเหนือจาก Set ที่ให้ "Clear" ใน API หรือไม่?
Veverke

1
นี่เป็นคำตอบที่น่าสนใจ - คิดว่ามันให้เครดิตมากกว่าที่ได้รับ ทำให้ฉันคิดว่า. ขอบคุณ!
Thomas

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 หากคุณมีค่าซ้ำในอาร์เรย์ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.