2012-05-02 12 views
51

मैं php array_keys()/array_values()हैश कुंजियों/मूल्यों

की जावास्क्रिप्ट बराबर निम्नलिखित js हैश दिया php के साथ अपरिचित लोगों के लिए नहीं मिल सकता है:

var myHash = {"apples": 3, "oranges": 4, "bananas": 42} 

मैं कैसे चाबियों का एक सरणी प्राप्त कर सकते हैं अर्थात

["apples", "oranges", "bananas"] 
मूल्यों के साथ

एक ही सवाल है, यानी

[3, 4, 42] 

jQuery का उपयोग किया जा सकता है।

+0

संभव डुप्लिकेट [ऑब्जेक्ट की चाबियों की सरणी प्राप्त करें] (http://stackoverflow.com/questions/8763125/get-array- ऑफ-ऑब्जेक्ट्स-चाबियाँ) और [जावास्क्रिप्ट ऑब्जेक्ट के सभी गुण मान कैसे प्राप्त करें (कुंजी को जानने के बिना)?] (http://stackoverflow.com/questions/7306669/how-to-get-all-properties-values -of-एक-जावास्क्रिप्ट वस्तु के बिना जानने-कुंजी)। –

उत्तर

44
var a = {"apples": 3, "oranges": 4, "bananas": 42};  

var array_keys = new Array(); 
var array_values = new Array(); 

for (var key in a) { 
    array_keys.push(key); 
    array_values.push(a[key]); 
} 

alert(array_keys); 
alert(array_values); 
+8

+1, हालांकि 'फॉर' लूप के अंदर एक चेक में लपेटा जाना चाहिए कि वर्तमान कुंजी वास्तव में प्रश्न की अपनी संपत्ति में वस्तु है (विरासत में संपत्ति के विपरीत)। अन्यथा, आईई में, आप कुछ अप्रत्याशित कुंजी प्राप्त कर सकते हैं: 'if (Object.prototype.hasOwnProperty.call (a, key)) {array_keys.push (key); array_values.push (a [key]);}' – JAAulde

+0

@ JAAulde: मुझे इस तरह के किसी भी आईई मुद्दे के बारे में पता नहीं है। जब एक वस्तु का आकलन करते हैं। क्या आप उस मुद्दे का और विवरण दे सकते हैं? क्या चाबियाँ मिलेंगी? –

+0

@amnotiam Crockford http://www.JSLint.com/lint.html#forin पर अपने LINT निर्देशों में इसकी अनुशंसा करता है और इस लेख पर लिखा गया एक लेख http://yuiblog.com/blog/2006/09/ पर संदर्भित करता है 26/इन-इन-साज़िश/ – JAAulde

59

ES5 में समर्थित (या shimmed) ब्राउज़रों ...

var keys = Object.keys(myHash); 

var values = keys.map(function(v) { return myHash[v]; }); 

MDN से shims, ...

+0

+1, क्या आप इन ब्राउज़रों के बारे में विस्तार से बता सकते हैं? – greg0ire

+0

@ greg0ire: समर्थित ब्राउज़र आमतौर पर कोई आधुनिक ब्राउज़र होते हैं। आम तौर पर अधिकांश क्रोम और सफारी उपयोग में, फ़ायरफ़ॉक्स 4+, ओपेरा 10+ * (शायद पहले?) *, और आईई 9। विरासत ब्राउज़र का समर्थन करने के लिए आप इन दोनों तरीकों को आसानी से शिम कर सकते हैं। –

+0

@ greg0ire: मैंने एमडीएन द्वारा प्रदान की गई शिम्स के लिंक जोड़े। –

1

अगर यह मदद करता है पता नहीं है, लेकिन "foreach" सभी कुंजियों के माध्यम से चला जाता है: (obj1 में वर कुंजी) {...}

+0

+1) का उपयोग करना था, यह – greg0ire

+1

मदद करता है "jquery/प्रोटोटाइप" -स्टाइल ऑब्जेक्ट्स के लिए देखें: ये पुस्तकालय सभी कार्यों को अलग-अलग फ़ंक्शन जोड़ते हैं ऑब्जेक्ट्स जिन्हें पुनरावृत्त किया जा रहा है जैसे कि वे भी चाबियाँ हैं ... इस मामले में आप दिए गए लाइब्रेरी द्वारा प्रदान किए गए ऑब्जेक्ट.एच() फ़ंक्शन का उपयोग करना चाहते हैं: http://api.jquery.com/jQuery.each/ थोड़ा सा विषय, लेकिन कुछ हद तक महत्वपूर्ण ... – Igor

3
function getKeys(obj){ 
    var keys = []; 
    for (key in obj) { 
     if (obj.hasOwnProperty(key)) { keys[keys.length] = key; } 
    } 
    return keys; 
} 
+0

+1 हैऑनप्रॉपर्टी के साथ उचित जांच के लिए +1 (हालांकि मैं इसे ऑब्जेक्ट.प्रोटोटाइप से कॉल करना पसंद करता हूं) – JAAulde

1

यहाँ के लिए phpjs.org से कार्यान्वयन:

यह मेरा कोड है, मैं बस आपको एक उपयोगी संसाधन के लिए इंगित कर रहा हूं।

function array_keys (input, search_value, argStrict) { 
    // Return just the keys from the input array, optionally only for the specified search_value 

    var search = typeof search_value !== 'undefined', 
     tmp_arr = [], 
     strict = !!argStrict, 
     include = true, 
     key = ''; 

    for (key in input) { 
     if (input.hasOwnProperty(key)) { 
      include = true; 
      if (search) { 
       if (strict && input[key] !== search_value) { 
        include = false; 
       } 
       else if (input[key] != search_value) { 
        include = false; 
       } 
      } 

      if (include) { 
       tmp_arr[tmp_arr.length] = key; 
      } 
     } 
    } 

    return tmp_arr; 
} 

उसी के लिए array_values (from the same PHP.js library) चला जाता है:

function array_values (input) { 
    // Return just the values from the input array 

    var tmp_arr = [], 
     key = ''; 

    for (key in input) { 
     tmp_arr[tmp_arr.length] = input[key]; 
    } 

    return tmp_arr; 
} 

संपादित करें: कोड से निकाला गया अनावश्यक खंड

+1

जो कार्य आप दिखा रहे हैं वह सरणी के बजाय हैश वापस कर रहा है या { 0: "test"} ["test"] के समानार्थी शब्द? – greg0ire

0

यहाँ PHP.js library से एक अच्छी array_keys का उदाहरण है।

+0

आपके द्वारा दिखाए जा रहे कार्यों को सरणी के बजाय हैश वापस करने लगते हैं या {0: "test"} ["test"] के समानार्थी हैं? – greg0ire

+0

@ greg0ire वे समानार्थी नहीं हैं। '{0:" test "}' 'ऑब्जेक्ट 'का एक उदाहरण है, जबकि' ["test"] '' ऐरे' का एक उदाहरण है। लेकिन उनमें से दोनों के पास '' परीक्षण ''सदस्य का' '' 'है। – Imp

+0

जावास्क्रिप्ट में ऑब्जेक्ट्स और सरणी हैं। हैश आप एक वस्तु के बारे में बात कर रहे हैं। यदि आप 'var tmp_arr = []' के साथ रेखा पर एक नज़र डालते हैं, तो यह दिखाता है कि 'tmp_arr' चर एक सरणी है (' [] ') लेकिन कोई वस्तु नहीं (' {} ')। तो दोनों विधियां सरणी लौटती हैं। – VisioN

0
var myHash = {"apples": 3, "oranges": 4, "bananas": 42} 
vals=(function(e){a=[];for (var i in e) a.push(e[i]); return a;})(myHash).join(',') 
keys=(function(e){a=[];for (var i in e) a.push( i); return a;})(myHash).join(',') 
console.log(vals,keys) 

मूल रूप से

array=(function(e){a=[];for (var i in e) a.push(e[i]); return a;})(HASHHERE) 
13

(लेखन के समय) दूसरा जवाब देता है:

var values = keys.map(function(v) { return myHash[v]; }); 

लेकिन मैं jQuery के अपने $.map उपयोग करने को प्राथमिकता:

var values = $.map(myHash, function(v) { return v; }); 

के बाद से jQuery सी का ख्याल रखता है रस्सी-ब्राउज़र संगतता। इसके अलावा यह छोटा है :)

किसी भी दर पर, मैं हमेशा जितना संभव हो उतना कार्यात्मक होने की कोशिश करता हूं। एक लाइनर लूप की तुलना में अच्छे हैं।