字符串索引数组上的Javascript数组操作

时间:2017-04-06 16:32:49

标签: javascript

好像是mapforEachfilter,这类运算符不适用于字符串索引数组,如下所示:

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

3 个答案:

答案 0 :(得分:2)

那是因为它不是"字符串索引的数组。" JavaScript并不具备这些功能。您拥有的是一个数组(因为您使用了[])但是您没有将它用作数组,您将其用作对象。 (数组也是对象;请参阅我的A myth of arrays。)这些是对象属性名称。如果您没有使用它的数组,请使用{}代替[]来创建它。

有几个操作迭代属性名称:

  • 您可以通过Object.keys获取一个对象自己的可枚举属性名称数组。还有Object.getOwnPropertyNames
  • 您可以使用for-in循环遍历所有可枚举属性(包括继承的属性)。
  • 普通对象不可迭代,因此我们无法使用for-of,但是如果你想要一个类似#34;字符串索引的数组"您可以查看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));




答案 1 :(得分: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))




答案 2 :(得分:0)

那是因为当您访问这样的数组时:

a['first element']

您没有访问数组元素。您将属性放在数组对象中。

您可以通过两种方式访问​​javascript对象中的属性:obj.property或obj ['property']。数组是一个像任何其他对象一样的对象,它有一些方法可以将元素放在数组中(.push),但由于它是一个对象,除了元素之外,它还可能有其他属性。它已经有一些(如.length)。所以你只需要包含更多。

对于你的pupose(maps)而不是使用数组对象,你可以使用一个空对象。像这样:

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

还有更新的Map和WeakMap对象。你想在这里查看它们的链接:https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Map

以下是使用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));