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
,并且可以使用数组方法( map
, forEach
, reduce
, filter
, find
等等)来迭代。但是,因为所有东西都是一个对象,所以总是可以自由地指定属性,因为这是你对任何对象所做的事情。 方括号表示法只是另一种访问属性的方式,所以在你的情况下:
array['Main'] = 'Main Page';
其实相当于:
array.Main = 'Main Page';
从你的描述来看,我的猜测是你想要一个“关联数组”,但对于JavaScript来说,这是一个使用对象作为哈希表的简单例子。 此外,我知道这是一个例子,但避免无意义的名称,只描述variablestypes(如array
),并根据它应该包含的名称(例如pages
)的名称。 简单的对象没有很多好的直接迭代方法,所以我们经常会首先使用Object
方法(在这种情况下为Object.keys
– 现在还有一些entries
和values
被添加到某些浏览器中)转化为数组,可以循环。
// 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
只跟踪数字键。 使用Object
或Map
对键值对。
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]); }