|
|
至今单身的伏特加 · MAC地址申请你知道多少?深光告诉你! - 知乎· 2 年前 · |
|
|
健身的咖啡豆 · Fortran程序中直接使用度(°)计算三角 ...· 2 年前 · |
|
|
爱运动的奔马 · ActiveMQ知识点 - 知乎· 2 年前 · |
|
|
高大的日光灯 · 闪豆视频下载器v3.2,支持64+视频平台, ...· 2 年前 · |
为什么我的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/
arr_jq_TabContents[key]
将该数组视为0索引形式。
已经有一些简单的示例,但我从您的问题表达方式中注意到,您可能来自PHP背景,并且您期望JavaScript以相同的方式工作--它不是。PHP
array
与JavaScript
Array
有很大不同。
在PHP中,关联数组可以完成数字索引数组所能做的大部分工作(
array_*
函数有效,您可以对其执行
count()
操作,等等)。您只需创建一个数组并开始将其赋值给字符串索引,而不是数字。
在JavaScript中,一切都是对象(除了基本类型:字符串、数字、布尔值),而数组是一种特定的实现,可以让您拥有数字索引。推送到数组的任何内容都会影响它的
length
,并且可以使用数组方法(
map
、
forEach
、
reduce
、
filter
、
find
等)进行迭代。但是,因为所有东西都是对象,所以您总是可以自由地简单地分配属性,因为这是您对任何对象所做的事情。方括号表示法只是访问属性的另一种方式,因此在您的示例中:
array['Main'] = 'Main Page';
实际上相当于:
array.Main = 'Main Page';
从你的描述来看,我猜你想要一个“关联数组”,但对于JavaScript来说,这是一个简单的使用对象作为哈希表的例子。另外,我知道这只是一个例子,但要避免没有意义的名称,这些名称只描述变量类型(例如
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 a static value
for (i in obj) {
count++;
if (obj.hasOwnProperty(i)) {
console.log(obj[i][count])
};
在这段代码中,我使用括号方法调用数组中的值,因为它包含一个数组。然而,简单地说,变量
i
有一个属性键和一个称为关联数组的两个值的循环的想法。
这是最完美的方法。
下面是将关联数组用作通用对象类型的简单方法:
Object.prototype.forEach = function(cb){
if(this instanceof Array) return this.forEach(cb);
let self = this;
Object.getOwnPropertyNames(this).forEach(
(k)=>{ cb.call(self, self[k], k); }
Object({a:1,b:2,c:3}).forEach((value, key)=>{
console.log(`key/value pair: ${key}/${value}`);
});
如果Node.js或浏览器支持
Object.entries()
,则可以将其用作使用
Object.keys()
(
Pointy's answer
)的替代方案。
const h = {
a: 1,
Object.entries(h).forEach(([key, value]) => console.log(value));
// logs 1, 2
在本例中,
forEach
使用数组的
destructuring assignment
。
这在大多数情况下(本质上)是不正确的:
var array = [];
array["Main"] = "Main page";
这将在名为
Main
的数组上创建一个非元素属性。尽管数组是对象,但通常您不希望在其上创建非元素属性。
如果希望按这些名称索引到
array
中,通常会使用
Map
或纯对象,而不是数组。
使用
Map
(ES2015+),我将其称为
map
,因为我很有创造力:
let map = new Map();
map.set("Main", "Main page");
然后使用来自其
values
、
keys
或
entries
方法的迭代器对其进行迭代,例如:
for (const value of map.values()) {
// Here, `value` will be `"Main page"`, etc.
}
使用一个普通对象,我将其创造性地称为
obj
let obj = Object.create(null); // Creates an object with no prototype
obj.Main = "Main page"; // Or: `obj["Main"] = "Main page";`
然后使用
Object.keys
、
Object.values
或
Object.entries
迭代其内容,例如:
for (const value of Object.values(proches_X)) {
// Here, `value` will be `"Main page"`, etc.
}