2017-04-06 72 views
-2

好像mapforEachfilter和这种运营商与字符串索引的数组,像这样不工作:JavaScript数组操作

let a = []; 
a['first element'] = 1; 
a['second element'] = 2; 
a['third element'] = 3; 
a.forEach(console.log) 
//undefined 
+0

边注:在大多数环境中,你很可能会被一点点你'someArray.forEach(执行console.log)看看有什么惊讶;'某些环境可能会引发错误(因为使用'this'调用'log'并不是指''console')。其他人可能会工作,但向你展示你不期望的东西,例如每个循环迭代的三件事情,而不是一件。这是因为大多数'console.log'实现会记录它们接收到的所有**参数,而'forEach'使用三个参数调用它的回调函数:入口,其索引和数组引用。 :-) –

回答

2

这是因为它不是一个“串索引阵列“。 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));

0

这是因为当你访问一个这样的数组:

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));

1

首先,你正在一个对象。

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))