2011-07-19 15 views
9

मेरे पास नाम कुंजी के साथ एक वस्तु है:मैं एक पैटर्न द्वारा ऑब्जेक्ट कुंजी कैसे प्राप्त करूं?

var names = { 
    "Peter Pan": {...}, 
    "Peter Parker": {...}, 
    "Tony Stark": {...}, 
    ... 
} 

क्या पैटर्न के अनुसार सभी चाबियाँ प्राप्त करने का कोई तरीका है। इसमें सभी चाबियाँ हैं?

मामला यह है कि मैं एक सरणी में सभी फ़िल्टर की गई चाबियाँ रखना चाहता हूं जैसे:

var filteredNames: [ 
    "Peter Pan", 
    "Peter Parker", 
    ... 
] 

उत्तर

13

आप आसानी से अपने आप को चाबियाँ पर पाशन से यह कर सकते हैं:

var filtered_keys = function(obj, filter) { 
    var key, keys = []; 
    for (key in obj) { 
    if (obj.hasOwnProperty(key) && filter.test(key)) { 
     keys.push(key); 
    } 
    } 
    return keys; 
} 
// example: 
var filteredNames = filtered_keys(names, /Peter/); // second parameter is a javascript regex object, so for exemple for case insensitive you would do /Peter/i 
+4

+1 * hasOwnProperty * का उपयोग करने के लिए +1। यदि सादा पाठ का सटीक मिलान आवश्यक है, तो नियमित अभिव्यक्ति की आवश्यकता नहीं है (स्ट्रिंग को * match * द्वारा RegExp में परिवर्तित कर दिया जाएगा)। यदि एक नियमित epxression का उपयोग किया जाता है, * परीक्षण * अधिक उपयुक्त है क्योंकि यह एक सरल एल्गोरिदम है और एक बूलियन (उदा। 'Filter.test (कुंजी)') देता है, जबकि * मिलान * एक सरणी देता है जिसे बूलियन में परिवर्तित किया जाएगा। – RobG

3

आप इसे केस संवेदी चाहते हैं:

var filteredNames = []; 

for(name in names) { 
    if(name.indexOf("Peter") > -1) { 
     filteredNames.push(name); 
    } 
} 

यदि नहीं:

var filteredNames = []; 

for(name in names) { 
    if(/peter/gi.test(name)) { 
     filteredNames.push(name); 
    } 
} 
+1

आपको इसके लिए हैऑनप्रॉपर्टी() का उपयोग करने की भी आवश्यकता होगी, अन्यथा आपके पास प्रोटोटाइप श्रृंखला में उच्चतर से चुने गए कुंजी हो सकते हैं (जब तक कि आप वही चाहते हैं)। – Lepidosteus

+0

@ लेपिडोस्टियस: सिवाय इसके कि यह एक ऑब्जेक्ट शाब्दिक है, इसलिए जब तक आप 'ऑब्जेक्ट.प्रोटोटाइप' का विस्तार नहीं करते हैं, तब तक चेन तक कोई भी समृद्ध गुण नहीं होंगे, इस मामले में आपका कोड * तोड़ना चाहिए * ताकि आप उस दोष को सही कर सकें। – user113716

+0

आप पूरी तरह से सही हैं, लेकिन मैं उनके कोड की एक पंक्ति के साथ और अधिक सोच रहा था, जबकि उनका वास्तविक उपयोग मामला कुछ ऐसा हो सकता है जहां नाम प्रोटोटाइप गुण हैं। उत्पादन कोड में इतने सारे दुरुपयोगों को देखते हुए, मुझे हिट होने से पहले ढाल मिलती है, इसलिए बोलने के लिए। – Lepidosteus

1

आप जावास्क्रिप्ट ऐरे प्रोटोटाइप का विस्तार कर सकते हैं, जैसे:

Array.prototype.regex_search = function(pattern) { 
    var returns = []; 
    for(var i = 0; i < this.length; i++) { 
    if(this[i].match(pattern) { 
     returns.push(i); 
    } 
    } 
    if(returns.length) { 
    return returns; 
    } else { 
    return false; 
    } 
} 

अब मैंने वास्तव में इस कोड का परीक्षण नहीं किया है, लेकिन यह जावास्क्रिप्ट में आपके द्वारा बनाए गए सभी सरणी देगा .regex_search जो तर्क 'पैटर्न' लेता है। तत्वों से मेल खाने पर कोई मिलान नहीं मिलने पर या इंडेक्स की सरणी मिलने पर यह झूठी वापसी होगी।

फिर आप इस सरणी पर फिर से चल सकते हैं और उन इंडेक्स को मूल सरणी से ले सकते हैं।

+0

वह ऑब्जेक्ट की चाबियों पर फिर से चल रहा है, एक सरणी नहीं। इसके अलावा, मैं ऐरे जैसे देशी वस्तुओं की प्रोटोटाइप श्रृंखला को संपादित करने की सिफारिश नहीं करता। – Lepidosteus

+0

आप काफी सही हैं, मैंने इसे पढ़ लिया होगा :-) – ikanobori

7
var filteredNames = Object.keys(names).filter((name) => /Peter/.test(name)); 
+1

यदि यह कोड किसी ब्राउज़र में चल रहा है, तो ध्यान रखें कि 'EE' और 'फ़िल्टर' IE8 और निम्न में असमर्थित हैं। – user113716

0

एकमा स्क्रिप्ट 5.1 एक वस्तु के गुणों के नाम वापस जाने के लिए Object.keys() प्रदान करता है।

var obj = { 0: 'a', 1: 'b', 2: 'c' }; 
console.log(Object.keys(obj)); // console: ['0', '1', '2'] 

Source

Standard

संबंधित मुद्दे