好像map
,forEach
,filter
和这种运营商与字符串索引的数组,像这样不工作:JavaScript数组操作
let a = [];
a['first element'] = 1;
a['second element'] = 2;
a['third element'] = 3;
a.forEach(console.log)
//undefined
好像map
,forEach
,filter
和这种运营商与字符串索引的数组,像这样不工作:JavaScript数组操作
let a = [];
a['first element'] = 1;
a['second element'] = 2;
a['third element'] = 3;
a.forEach(console.log)
//undefined
这是因为它不是一个“串索引阵列“。 JavaScript没有这些。你在那里有一个数组(因为你使用了[]
),但是你并没有将它作为一个数组使用,所以你将它用作一个对象。 (数组也是对象;请参阅我的A myth of arrays。)这些是对象属性名称。如果您没有使用它的数组性质,请使用{}
而不是[]
来创建它。
有几个操作进行迭代属性名称:
Object.keys
得到一个对象自己的,枚举的属性名称的数组。还有Object.getOwnPropertyNames
。for-in
循环遍历所有可枚举的属性(包括继承的属性)。for-of
,但是如果你想要类似“字符串索引数组”的东西,你可以看看Map
,这是可迭代的。这里有几个例子:
let a = {};
a['first element'] = 1;
a['second element'] = 2;
a['third element'] = 3;
console.log("for-in:");
for (let key in a) {
console.log(key);
}
console.log("Object.keys:");
Object.keys(a).forEach(key => console.log(key));
这是因为当你访问一个这样的数组:
a['first element']
你不能访问数组元件。你将一个属性放入数组对象中。
您可以通过两种方式访问JavaScript对象中的属性:obj.property或obj ['property']。一个数组是一个像其他任何对象一样的对象,它有一些方法可以将元素放入数组中(.push),但由于它是一个对象,除了元素之外,它还可能具有其他属性。它已经有一些(如.length)。所以你只是包括更多。
对于你的pupose(地图)而不是使用数组对象,你可以使用一个空对象。就像这样:
let a = {};
a['first element'] = 1;
a['second element'] = 2;
a['third element'] = 3;
// then you use for...in instead of forEach:
for(element in a) {
// and get the value of the property in the element like this:
console.log(a[element]);
}
另外还有新的地图和WeakMap对象。你想看看他们在这里的链接:https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Map
下面是使用地图的例子:
所有的var a = new Map();
a.set('first element', 1);
a.set('second element', 2);
a.set('third element', 3);
for (var [key, value] of a) {
console.log(key + ": " + value);
}
// Now you can also use forEach
a.forEach((value, key)=>console.log(key + ": " + value));
首先,你正在一个对象。
a['first element'] = 1;
^^^^^ -> key ^-> it's value
如果你想分配指定的元素到数组,请参阅a
阵列,它的指定index
- 例如[0]
并分配一些值,例如1
。
而关于Array#forEach
函数 - 如果你想记录每个元素,你必须传递一个参数来保存数组中的每个元素。
let a = [];
a[0] = 1;
a[1] = 2;
a[2] = 3;
a.forEach(v => console.log(v))
边注:在大多数环境中,你很可能会被一点点你'someArray.forEach(执行console.log)看看有什么惊讶;'某些环境可能会引发错误(因为使用'this'调用'log'并不是指''console')。其他人可能会工作,但向你展示你不期望的东西,例如每个循环迭代的三件事情,而不是一件。这是因为大多数'console.log'实现会记录它们接收到的所有**参数,而'forEach'使用三个参数调用它的回调函数:入口,其索引和数组引用。 :-) –