2

私は、XML ドキュメントを受け取り、(必要に応じて) 多次元の連想配列を作成する Javascript 関数に取り組んでいます。関数内では、配列は適切に構築されますが、Array オブジェクトを返すと、空の配列が返されます。

興味深いことに、push メソッドを使用して、代入演算子 (array[index]=value) を使用するのではなく {"index": index, "value":value} の形式でリテラル配列をプッシュすると、問題なく動作します。

テストのために、次の XML ノード オブジェクト (Level_1_node) を使用しています。

<Level_1>
    <Level_2>VALUE</Level_2>
</Level_1>

関数は次のとおりです。

function get_array_from_XML(XML_node){
    var XML_array = new Array();
    var child_node;

    for(var i=0; i<XML_node.childNodes.length; i++){
        child_node = XML_node.childNodes[i];
        if(child_node.childNodes[0]){
            if (child_node.childNodes[0].nodeType == 3){
                XML_array[child_node.nodeName] = child_node.childNodes[0].nodeValue;
            } else {                
                XML_array[child_node.nodeName] = get_array_from_XML(child_node);
            }
        }
    }

    dump(XML_array);  //for my debugging, alerts "LEVEL_2 => VALUE", so everything seems fine

    return XML_array;
}

次のメソッドは機能しますが、戻り形式は望ましくありません。

function get_array_from_XML_using_push(XML_node){
    var XML_array = new Array();
    var child_node;

    for(var i=0; i<XML_node.childNodes.length; i++){
        child_node = XML_node.childNodes[i];
        if(child_node.childNodes[0]){
            if (child_node.childNodes[0].nodeType == 3){
                XML_array.push({
                    "index" : child_node.nodeName,
                    "value" : child_node.childNodes[0].nodeValue
                });
            } else {                
                XML_array.push({
                    "index" : child_node.nodeName,
                    "value" : get_array_from_XML_using_push(child_node)
                });
            }
        }
    }

    dump(XML_array);  //shows the fully populated array

    return XML_array;
}

実行するget_array_from_XML(Level_1_node)と、空の配列がget_array_from_XML_using_push(Level_1_node)返されますが、返されます

{0 => {"index" => "Level_2", "value" => "VALUE"}}

とてもイライラします。どんな洞察も大歓迎です。

4

1 に答える 1

4

に変更new Array()new Object()ます。Arrayコンストラクターは連想配列用ではありません。これは、数値的にインデックス付けされた配列専用です。JavaScript では、オブジェクト自体が連想配列としても機能します。

function get_array_from_XML(XML_node){
    var XML_array = new Object();
    // -------------------^
    var child_node;

    for(var i=0; i<XML_node.childNodes.length; i++){
        child_node = XML_node.childNodes[i];
        if(child_node.childNodes[0]){
            if (child_node.childNodes[0].nodeType == 3){
                XML_array[child_node.nodeName] = child_node.childNodes[0].nodeValue;
            } else {                
                XML_array[child_node.nodeName] = get_array_from_XML(child_node);
            }
        }
    }

    dump(XML_array);  //for my debugging, alerts "LEVEL_2 => VALUE", so everything seems fine

    return XML_array;
}

オブジェクトを連想配列として使用する

次の例を見てください。

var colors = new Object();
colors['red'] = '#f00';
colors['green'] = '#0f0';
colors['blue'] = '#00f';
colors['black'] = '#000';
colors['white'] = '#fff';

conosle.log(colors['red']); // => #f00
conosle.log(colors['green']); // => #0f0
conosle.log(colors['white']); // => #fff

// Use for..in or Object.keys to iterate over an object
for (var key in colors) {
    console.log(key, colors[key]);
}
// Logs all colors and their corresponding code

Object.keys(colors).forEach(function(key) {
    console.log(key, colors[key]);
});
// Also logs all colors and their corresponding code

colors['red'] = '#f00';は と同じであることに注意してくださいcolors.red = '#f00';。角括弧表記は、無効な識別子である文字列を使用する場合、または変数の値をプロパティ名として使用する場合にのみ必要です。

于 2012-11-29T06:05:56.230 に答える