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