2011-10-05 74 views
5

我正在使用一個對象作爲哈希表。我想快速打印出它的內容(例如alert())。有什麼內置的將散列轉換爲(鍵,值)對的數組?壓扁對象到數組?

+0

'console.log'或'console.dir'有什麼問題? – jAndy

+0

控制檯有什麼問題。日誌()?爲什麼要提醒它從不顯示足夠的調試信息。新的瀏覽器控制檯應顯示足夠的信息,如果你console.log你的變量。此外,JS數組是對象..或者如果你願意,對象是關聯數組。 –

+0

@ N.B. .: JS'Array's是'Object's;和JS'Object'模擬「關聯數組」的概念,但「關聯數組」和「數組」是不同的概念。我們不要混淆它們! OP的術語是現貨。 –

回答

2

我更新了這個更多一些。這比解析console.log要容易得多,因爲它省去了像__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'?問題是如何平整數據。 'alert()'僅被提及「例如」。如果他想通過Ajax將其發送回服務器以便在那裏記錄,該怎麼辦? –

+0

我知道'console.log',這對我的大多數調試需求來說確實很棒。但是有時候我發現使用alert可以準確找出事件發生的時間。直到警報發出後,代碼纔會執行​​,直到您確定警報。通常,當這種行爲不需要時,沒有什麼理由使用alert()。 –

0

使用for循環:

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

那樣,你只會看到值。弼,即使你也密集了鑰匙,它可能會多次提醒。您應該創建一個字符串並提醒最終輸出。 – jAndy

+0

好吧,這只是for循環的一個例子,並不是一個完整的實現。他應該能夠找出其他問題。 – m0sa

1

不,我知道的。不過,你可以自己做相當簡潔:

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 }] 

當然,你不能alert這兩種,所以你還不如干脆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': 'X', '用戶名': 'AAA'} \ N' 'myUsers [1 ] = {'id':'y','username':'bbb'}' 'Object.keys(myUsers).map(function(key){return myUsers [key] .username;})' Thanks ! – 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] }`; 
    })); 
} 

因此改變過去的回報,你可以將元素格式化您的數組中。