Javascript关联数组返回空/未定义,尽管在函数内部填充

Javascript关联数组返回空/未定义,尽管在函数内部填充,javascript,return-value,associative-array,dynamic-arrays,Javascript,Return Value,Associative Array,Dynamic Arrays,我正在开发一个Javascript函数,它接受一个XML文档并创建一个多维(根据需要)关联数组。在函数内部,数组正确构建,但是在返回数组对象时,它返回一个空数组 有趣的是,如果我使用push方法,并以{“index”:index,“value”:value}的形式推送一个文本数组,而不是使用赋值运算符(Array[index]=value),那么它工作得很好 为了进行测试,我使用了以下XML节点对象(级别1节点): 非常令人沮丧。欢迎提供任何见解。将新数组()更改为新对象()。数组构造函数不适用

我正在开发一个Javascript函数,它接受一个XML文档并创建一个多维(根据需要)关联数组。在函数内部,数组正确构建,但是在返回数组对象时,它返回一个空数组

有趣的是,如果我使用push方法,并以{“index”:index,“value”:value}的形式推送一个文本数组,而不是使用赋值运算符(Array[index]=value),那么它工作得很好

为了进行测试,我使用了以下XML节点对象(级别1节点):

非常令人沮丧。欢迎提供任何见解。

新数组()
更改为
新对象()
数组
构造函数不适用于关联数组;它仅适用于数字索引数组。对象本身在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;
}
请注意,
colors['red']='f00'与颜色相同。红色='#f00'。只有当您想使用无效标识符的字符串或想将变量的值用作属性名时,方括号表示法才真正需要。

新数组()
更改为
新对象()
数组
构造函数不适用于关联数组;它仅适用于数字索引数组。对象本身在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;
}

请注意,
colors['red']='f00'与颜色相同。红色='#f00'。只有当您想使用无效标识符的字符串或想将变量的值用作属性名时,方括号表示法才真正需要。

您意识到javascript没有关联数组吗?它们有数组和对象。如果需要数字索引,请使用数组。如果需要命名索引,请使用对象,并让每个命名索引都成为属性。除了字符串版本的整数外,不应在数组([])中使用非数字“键”,这是正确处理的。这是针对对象({})的,虽然我听说过“Javascript不使用关联数组”,但我从未有人深入研究过这些细微差别。这就把事情弄清楚了。谢谢。是的,当您执行
list['one']=1
时,实际发生的是数组的底层对象具有名为
one
的属性,该属性的值为
1
。然后可以通过
list['one']
list.one
访问该属性,即它不是数组。但是,只要索引是一个实际整数,并且所分配的对象已正确初始化,即
list[1]={key:value},就可以拥有一个对象数组。你知道javascript没有关联数组吗?它们有数组和对象。如果需要数字索引,请使用数组。如果需要命名索引,请使用对象,并让每个命名索引都成为属性。除了字符串版本的整数外,不应在数组([])中使用非数字“键”,这是正确处理的。这是针对对象({})的,虽然我听说过“Javascript不使用关联数组”,但我从未有人深入研究过这些细微差别。这就把事情弄清楚了。谢谢。是的,当您执行
list['one']=1
时,实际发生的是数组的底层对象具有名为
one
的属性,该属性的值为
1
。然后可以通过
list['one']
list.one
访问该属性,即它不是数组。但是,只要索引是一个实际整数,并且所分配的对象已正确初始化,即
list[1]={key:value},就可以拥有一个对象数组
数组构造函数仅用于数字索引数组
——使用JS几年后,今天我第一次偶然发现了这个问题。真不敢相信,它还没有越过我的路。感谢您提供的宝贵信息<代码>数组构造函数仅适用于数字索引数组
——使用JS几年后,今天我第一次无意中发现了这个问题。真不敢相信,它还没有越过我的路。感谢您提供的宝贵信息!
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;
}
{0 => {"index" => "Level_2", "value" => "VALUE"}}
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