JavaScript foreach循环关联数组对象

为什么我的for-each循环没有遍历我的JavaScript关联数组对象?

// defining an array var array = []; // assigning values to corresponding keys array["Main"] = "Main page"; array["Guide"] = "Guide page"; array["Articles"] = "Articles page"; array["Forum"] = "Forum board"; // expected: loop over every item, // yet it logs only "last" assigned value - "Forum" for (var i = 0; i < array.length; i++) { console.log(array[i]); } 

编辑:jQuery each()可能会有所帮助: https : //api.jquery.com/jQuery.each/

.length属性只跟踪数字索引(键)的属性。 您正在使用string键。

你可以这样做:

 var arr_jq_TabContents = {}; // no need for an array arr_jq_TabContents["Main"] = jq_TabContents_Main; arr_jq_TabContents["Guide"] = jq_TabContents_Guide; arr_jq_TabContents["Articles"] = jq_TabContents_Articles; arr_jq_TabContents["Forum"] = jq_TabContents_Forum; for (var key in arr_jq_TabContents) { console.log(arr_jq_TabContents[key]); } 

为了安全起见,在这样的循环中确保没有任何属性是意外的inheritance结果:

 for (var key in arr_jq_TabContents) { if (arr_jq_TabContents.hasOwnProperty(key)) console.log(arr_jq_TabContents[key]); } 

编辑 – 现在可能是一个好主意,注意Object.keys()函数可用于现代浏览器和节点等。该函数返回一个对象的“自己”的键,作为一个数组:

 Object.keys(arr_jq_TabContents).forEach(function(key, index) { console.log(this[key]); }, arr_jq_TabContents); 

传递给.forEach()的callback函数是通过Object.keys()返回的每个键和数组中的键的索引来调用的。 它也传递了函数迭代的数组,但是这个数组对我们来说并不是很有用。 我们需要原始的对象 。 这可以直接通过名字来访问,但是(在我看来)显式地传递它会更好一些,这是通过传递第二个参数给.forEach() – 原始对象将在callback中被绑定。 (刚刚看到这在下面的评论中被注意到了。)

这是非常简单的方法。 优点是你也可以得到钥匙:

 for (var key in array) { let value = array[key]; console.log(value); } 

arr_jq_TabContents[key]将数组视为0索引forms。

已经有一些直截了当的例子了,但是我注意到你已经提出了你的问题,你可能来自PHP背景,并且你期望JavaScript以同样的方式工作 – 事实并非如此。 一个PHP array与JavaScript Array非常不同。

在PHP中,关联数组可以完成大部分的数字索引数组( array_*函数可以工作,可以对其进行count()等等)。您只需创build一个数组,然后开始分配string索引而不是数字。

在JavaScript中,一切都是一个对象(除了primitives:string,numeric,boolean),而数组是一个特定的实现,可以让你有数字索引。 任何推送到一个数组的东西都会影响它的length ,并且可以使用数组方法( mapforEachreducefilterfind等等)来迭代。但是,因为所有东西都是一个对象,所以总是可以自由地指定属性,因为这是你对任何对象所做的事情。 方括号表示法只是另一种访问属性的方式,所以在你的情况下:

 array['Main'] = 'Main Page'; 

其实相当于:

 array.Main = 'Main Page'; 

从你的描述来看,我的猜测是你想要一个“关联数组”,但对于JavaScript来说,这是一个使用对象作为哈希表的简单例子。 此外,我知道这是一个例子,但避免无意义的名称,只描述variablestypes(如array ),并根据它应该包含的名称(例如pages )的名称。 简单的对象没有很多好的直接迭代方法,所以我们经常会首先使用Object方法(在这种情况下为Object.keys – 现在还有一些entriesvalues被添加到某些浏览器中)转化为数组,可以循环。

 // assigning values to corresponding keys const pages = { Main: 'Main page', Guide: 'Guide page', Articles: 'Articles page', Forum: 'Forum board', }; Object.keys(pages).forEach((page) => console.log(page)); 
 var obj = { no : ["no",32], nt : ["no",32], nf : ["no",32,90] }; count = -1; // which must be static value for(i in obj){ count++; if(obj.hasOwnProperty(i){ console.log(obj[i][count]) }; }; 

在这段代码中,我使用括号方法调用数组中的值,因为它包含数组,但是简要地说,variablesi有一个属性键和一个循环,这两个值都被称为关联数组的值

完美的方法,如果你感兴趣,按像

使用数字键。 Array上的length只跟踪数字键。 使用ObjectMap对键值对。

 var array = []; // assigning values to corresponding keys array[0] = "Main page"; array[1] = "Guide page"; array[2] = "Articles page"; array[3] = "Forum board"; for (var i = 0; i < array.length; i++) { console.log(i); //0 1 2 3 //OR: console.log(array[i]); }