2011-10-05 5 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

。それは__proto__のような余分なものを除外するので、これはconsole.logよりも解析するのがずっと簡単です。

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

私がこれを改善するために行う唯一のことは、再帰レベルに基づいて正しくインデントされていることです。 alertで迅速な&汚い用の

+0

なぜあなたは 'console.log'よりもこれを選択しますか?なぜあなたのブラウザが提供する素晴らしいデバッグオプションを避けていますか? –

+2

誰かが 'console.log'を避けていると誰が言ったのですか?問題は、データをフラット化する方法でした。 'alert()'は "例えば"としか言いませんでした。 Ajax経由でサーバーに戻してログに記録する場合はどうなりますか? –

+0

私は 'console.log'を知っていて、私のデバッグニーズの大半は確かに素晴らしいです。しかし時には何かが起こった時を正確に知るためにアラートを使用することが役立つことがあります。アラートの直後にあるコードは、アラートをOKにするまで実行されません。一般に、この動作が望ましくないときは、 'alert()'を使う理由はほとんどありません。 –

0

は、forループを使用します。

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

そのようにすれば、値だけが表示されます。 Buteキーを集中させても、恐らく何度も警告するでしょう。 1つの文字列を作成し、最終出力を警告する必要があります。 – jAndy

+0

これはforループの単なる例であり、opが望むものの完全な実装ではありません。彼は残りを理解することができるはずです。 – 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

ああ、はい、それは次のとおり 'のvar myUsers = {};' 'myUsers [0] = { 'ID': 'X'、 'ユーザ名': 'AAA'} \ N ' ' myUsers [1 ] = { 'ID': 'Y'、 'ユーザ名': 'BBB'} '' Object.keys(myUsers).MAP(関数(キー){リターンmyUsers [キー] .username;}) ' おかげ! – dirkk0

1

あなたは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]} 
} 

機能は、このようなものです:

VAR出力= []

フラット化(:

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] }`; 
    })); 
} 

だから、最後のリターンあなたは、配列内の要素をフォーマットすることができますを変更します。

関連する問題