जावास्क्रिप्ट सरणी सेट करने के लिए


145

MSDN जावास्क्रिप्ट के सेट संग्रह अमूर्त का संदर्भ देता है । मुझे उन वस्तुओं का एक सरणी मिला है, जिन्हें मैं एक सेट में बदलना चाहता हूं ताकि मैं .delete()नाम से विभिन्न तत्वों को हटा सकूं।

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

मैं इस सरणी को सेट में कैसे बदलूं? अधिक विशेष रूप से, क्या उपरोक्त सरणी पर पुनरावृत्ति के बिना ऐसा करना संभव है? प्रलेखन में अपेक्षाकृत कमी है (तत्काल सेट के लिए पर्याप्त है; रूपांतरणों के लिए नहीं - यदि संभव हो तो)।

मैं मानचित्र को रूपांतरण के बारे में भी सोच सकता हूं , कुंजी द्वारा हटाने के लिए। मैं जो पूरा करने की कोशिश कर रहा हूं वह एक संग्रहणीय संग्रह है जिसे मुख्य रूप से एक कुंजी के माध्यम से तत्वों तक पहुंच के माध्यम से पहुँचा या संशोधित किया जा सकता है (जैसा कि सूचकांक के विपरीत)।

एक सरणी से दूसरे लक्ष्य में रूपांतरण अंतिम लक्ष्य है।


1
एक साधारण पुरानी वस्तु की तरह लगता है आप के लिए काम करेंगे ...
dandavis

3
@ थोमस: तो मुझे कुछ याद आ रहा है, जिसे मैं सीखना चाहता हूं। Var s = new Set (), ऑब्जेक्ट्स को जोड़ना और s.delete (जो भी हो) - और var o = {1: 'aaa', 2: 'bbbb' ...} और डिस्क्रिप्शन जारी करने के बीच अंतर क्या है [o] '1'])?
विवेके

1
@Veverke कि आप प्रारंभिक टिप्पणी (+1) की तुलना में अधिक वर्णनात्मक थे। धन्यवाद। लेकिन, फिर से, क्या यह संभव है कि एरे को ऑब्जेक्ट के अलावा एरे के कंटेंट के अलावा एरे पर और बिना लिस्ट के, की-ऐक्सेसिबल स्ट्रक्चर को बनाए रखा जाए? लगता है कि आपको एक विचार मिल गया है। अगर आप को विस्तृत करने का समय मिल गया है तो मुझे इसका उत्तर प्रारूप में देखने में कोई दिक्कत नहीं होगी।
थॉमस

2
वह सरणी ऑब्जेक्ट कानूनी नहीं है, क्योंकि {"bob", "dole"}वैध ऑब्जेक्ट नहीं है।
अलनीतक

1
@Veverke ES6 Setऔर Mapउन डेटा कंस्ट्रक्शंस के "शुद्ध" कार्यान्वयन हैं जो उन मुद्दों को पीड़ित नहीं करते हैं जो कर Objectसकते हैं जब चीजों को इसके प्रोटोटाइप में जोड़ा जाता है।
अलनीतक

जवाबों:


204

बस सरणी को सेट निर्माता के पास करें। सेट निर्माता iterableपैरामीटर को स्वीकार करता है । ऐरे ऑब्जेक्ट iterableप्रोटोकॉल को लागू करता है, इसलिए यह एक वैध पैरामीटर है।

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

यहाँ देखें


सख्ती से सही है, हालांकि मैं ओपी के डेटा के ख़राब होने के बाद से खुद को एक जवाब जोड़ने में संकोच कर रहा हूं और इसलिए यह स्पष्ट नहीं है कि वह क्या उम्मीद करता है
Alnitak

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
धन्यवाद एस्ट्रो :-) दरअसल, इससे यह सवाल खुल गया: "सेट ऑब्जेक्ट और प्लेन ऑब्जेक्ट में क्या अंतर है"? यद्यपि, जैसा कि मैंने ऊपर टिप्पणियों में नोट किया है, "सेट" एक रैप अप प्रकार है जो "स्पष्ट" की "कार्यक्षमता के लिए अच्छा" प्रदान करता है।
विवेके

संक्षेप में, मुझे लगता है कि पोस्ट के शीर्षक को "सेट ऑब्जेक्ट और जावास्क्रिप्ट में एक सादे वस्तु के बीच अंतर क्या है" में बदल दिया जाना चाहिए, और ध्यान दें कि "इस और इसे हासिल करने की कोशिश में ... मैंने खुद से पूछना समाप्त कर दिया। क्या अंतर है ...
विवेके

@Veverke "एक सेट ऑब्जेक्ट और एक प्लेन ऑब्जेक्ट के बीच अंतर क्या है", बस डॉक्टर को पढ़ सकता है ..
14

1
@Hacketo: क्या आपको इसके एपी में "क्लियर" प्रदान करने के अलावा कोई अन्य सेट मिलता है?
विवेके

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.