2011-10-05 14 views
5

मैं एक वस्तु का उपयोग हैश तालिका के रूप में कर रहा हूं। मैं इसके लिए अपनी सामग्री को तुरंत प्रिंट करना चाहता हूं (उदाहरण के लिए alert())। हैश को (कुंजी, मूल्य) जोड़े के सरणी में बदलने के लिए कुछ भी बनाया गया है?ऑब्जेक्ट पर फ़्लैट ऑब्जेक्ट?

+0

'console.log' या' console.dir' के साथ क्या गलत है? – jAndy

+0

कंसोल के साथ क्या गलत है।लॉग इन करें()? चेतावनी क्यों? यह पर्याप्त डीबगिंग जानकारी कभी नहीं दिखाता है। यदि आप अपने चर को console.log करते हैं तो नए ब्राउज़र के कंसोल को पर्याप्त जानकारी प्रदर्शित करनी चाहिए। इसके अलावा, जेएस सरणी वस्तुएं हैं .. या यदि आप करेंगे, वस्तुएं सहयोगी सरणी हैं। –

+0

@ एनबी .: जेएस 'ऐरे' ऑब्जेक्ट की हैं; और जेएस 'ऑब्जेक्ट का मॉडल "सहयोगी सरणी" की अवधारणा है, लेकिन "सहयोगी सरणी" और' ऐरे 'अलग-अलग विचार हैं। चलो उन्हें भ्रमित मत करो! ओपी की शब्दावली स्पॉट पर है। –

उत्तर

2

मैं इस में कुछ और अपडेट किया गया। कंसोल.लॉग से भी पार्स करना बहुत आसान है क्योंकि यह __proto__ जैसे अतिरिक्त सामान को छोड़ देता है।

function flatten(obj) { 
    var empty = true; 
    if (obj instanceof Array) { 
     str = '['; 
     empty = true; 
     for (var i=0;i<obj.length;i++) { 
      empty = false; 
      str += flatten(obj[i])+', '; 
     } 
     return (empty?str:str.slice(0,-2))+']'; 
    } else if (obj instanceof Object) { 
     str = '{'; 
     empty = true; 
     for (i in obj) { 
      empty = false; 
      str += i+'->'+flatten(obj[i])+', '; 
     } 
     return (empty?str:str.slice(0,-2))+'}'; 
    } else { 
     return obj; // not an obj, don't stringify me 
    } 
} 

एकमात्र चीज जो मैं इसे सुधारने के लिए करूंगा, वह रिकर्सन स्तर पर सही ढंग से इंडेंट है।

+0

आप इसे 'console.log' पर क्यों चुनेंगे? आप अपने ब्राउज़र को आपके लिए प्रदान किए जाने वाले शानदार डिबगिंग विकल्पों का उपयोग क्यों कर रहे हैं? –

+2

किसने कहा कि कोई भी 'console.log' को छोड़ रहा था? सवाल यह था कि डेटा कैसे फ़्लैट करना है। 'चेतावनी() 'का उल्लेख केवल" उदाहरण के लिए "किया गया था। क्या होगा यदि वह अजाक्स के माध्यम से इसे सर्वर पर वापस भेजना चाहता है? –

+0

मुझे 'console.log' के बारे में पता है और यह मेरी अधिकांश डीबगिंग आवश्यकताओं के लिए निश्चित रूप से बहुत अच्छा है। हालांकि कभी-कभी मुझे कुछ पता होने पर पता लगाने के लिए अलर्ट का उपयोग करना उपयोगी लगता है। एक चेतावनी के बाद सीधे आने वाला कोड निष्पादित नहीं होता है जब तक कि आप अलर्ट ठीक नहीं करते। आम तौर पर जब यह व्यवहार वांछित नहीं होता है तो 'चेतावनी() 'का उपयोग करने के लिए कोई कारण नहीं है। –

0

का उपयोग पाश के लिए:

for (var x in yourObj) 
{ 
    alert(yourObj[x]); 
} 
+0

इस तरह आप केवल मूल्य देखेंगे। लेकिन अगर आप चाबियों को भी ध्यान में रखते हैं, तो यह कई बार कई बार सतर्क होगा। आपको एक स्ट्रिंग बनाना चाहिए और अंतिम आउटपुट को अलर्ट करना चाहिए। – jAndy

+0

अच्छी तरह से यह लूप के लिए एक उदाहरण है, ओप चाहता है कि एक पूर्ण कार्यान्वयन नहीं। वह बाकी को समझने में सक्षम होना चाहिए। – m0sa

1

ऐसा नहीं है कि मैं के बारे में पता कर रहा हूँ। फिर भी, आप इसे अपने आप को काफी संक्षेप में कर सकते हैं: alert यह या तो

var obj = { a: 1, b: 2, c: 3 }; 
var arr = []; 
for (var i in obj) { 
    var e = {}; 
    e[i] = obj[i]; 
    arr.push(e); 
} 
console.log(arr); 
// Output: [Object { a=1 }, Object { b=2 }, Object { c=3 }] 
बेशक

, आप नहीं कर सकते, तो आप ऐसा कर सकते रूप में अच्छी तरह सिर्फ console.log(obj) पहली जगह में।


आप सकता है सरणियों के उत्पादन सरणियों:

var obj = { a: 1, b: 2, c: 3 }; 
var arr = []; 
for (var i in obj) { 
    arr.push([i, obj[i]]); 
} 
console.log(arr); 
// Output: [["a", 1], ["b", 2], ["c", 3]] 

alert(arr); 
// Alert: a, 1, b, 2, c, 3 

लेकिन, फिर से, ew।

6

चूंकि आप alert करना चाहते हैं, मुझे लगता है कि यह आपके उत्पादन संस्करण के लिए नहीं है, और पुरानी ब्राउज़र संगतता कोई समस्या नहीं है।

यदि यह मामला है, तो आप ऐसा कर सकते हैं:

var myHash = ...... 
alert(Object.keys(myHash).map(function(key) { return [key, myHash[key]]; })); 
+0

यह बहुत प्यारा है। –

+0

ओह, हाँ यह है: 'वर myUsers = {};' 'myUsers [0] = { 'id': 'एक्स', 'उपयोगकर्ता नाम': 'एएए'} \ n' ' myUsers [1 ] = {'id': 'y', 'username': 'bbb'} ' 'ऑब्जेक्ट.कीज (myUsers) .map (फ़ंक्शन (कुंजी) {myUsers [key] .username;})' धन्यवाद ! – dirkk0

1
alert में त्वरित & गंदा उपयोग के लिए

आप JSON इस्तेमाल कर सकते हैं:

alert(JSON.stringify(yourObj).replace(/,/g,'\n')); 
1

यहाँ यह की मेरी संस्करण है। यह आप नीचे की तरह इनपुट समतल के लिए अनुमति चाहिए:

var input = { 
    a: 'asdf', 
    b: [1,2,3], 
    c: [[1,2],[3,4]], 
    d: {subA: [1,2]} 
} 

समारोह इस तरह है:

function flatten (input, output) { 

     if (isArray(input)) { 
     for(var index = 0, length = input.length; index < length; index++){ 
      flatten(input[index], output); 
     } 
     } 
     else if (isObject(input)) { 
     for(var item in input){ 
      if(input.hasOwnProperty(item)){ 
      flatten(input[item], output); 
      } 
     } 
     } 
     else { 
     return output.push(input); 
     } 
    }; 

    function isArray(obj) { 
     return Array.isArray(obj) || obj.toString() === '[object Array]'; 
    } 

    function isObject(obj) { 
     return obj === Object(obj); 
    } 

प्रयोग की तरह कुछ है:

वर उत्पादन = []

समतल (इनपुट आउटपुट);

तब उत्पादन फ़्लैटेड सरणी होना चाहिए।

0

शायद थोड़ा देर हो चुकी है, लेकिन यहां आपके पास उत्तर का मेरा संस्करण है, जिसे ES2015 में अपडेट किया गया है। मैं एक पुनरावर्ती समारोह का उपयोग करें और यह काम करता है, भले ही मुख्य उद्देश्य के अंदर अन्य वस्तुओं हैं:

function objectFlattener (object) { 
    return Reflect.apply(Array.prototype.concat, [], Object.keys(object).map(key => { 
    if (object[key] instanceof Object) { 
     return objectFlattener(object[key]); 
    } 
    return `${ key }: ${ object[key] }`; 
    })); 
} 

तो पिछले वापसी आप अपने सरणी के अंदर तत्व फ़ॉर्मेट कर सकते हैं बदल रहा है।

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