在javascript数组中按值获取索引

Posted

技术标签:

【中文标题】在javascript数组中按值获取索引【英文标题】:get index by value in javascript array 【发布时间】:2016-05-06 15:17:47 【问题描述】:

阅读 typescript 中的“枚举”,我看到这段代码编译为 javascript

var Season = [];
Season[Season["Spring"] = 0] = "Spring";
Season[Season["Summer"] = 1] = "Summer";
Season[Season["Fall"] = 2] = "Fall";
Season[Season["Winter"] = 3] = "Winter";

console.log(Season.Spring); // 0
console.log(Season[0]); // Spring

并且,如果我在第一行将 Season 更改为 空 objext,这也有效,而且很有意义。 不知道怎么回事,听着。 这是什么?

编辑:是的。这不是编译器生成的。编译器使用空对象。但是,如果我将其更改为空数组。它仍然有效。我的问题是为什么数组也很好用。起初我的问题包括两个版本,但有人编辑了问题并删除了对象使用版本。

【问题讨论】:

编译器编写 JavaScript 时会发生这种情况。 其实这不是编译器生成的。看我的回答***.com/a/35075698/390330 数组是对象,因此如果您所做的只是使用方括号表示法分配属性,那么两者的行为完全相同。数组有一个特殊的长度属性,但在其他方面并不特殊(它们继承的属性大多是通用的,可以应用于任何合适的对象)。 @RobG 谢谢,这就是我想知道的。 【参考方案1】:

这个:

Season[Season["Spring"] = 0] = "Spring";
Season[Season["Summer"] = 1] = "Summer";
Season[Season["Fall"] = 2] = "Fall";
Season[Season["Winter"] = 3] = "Winter";`

在 Season 对象中创建八个属性:

Season["Spring"] = 0;
Season["Summer"] = 1;
Season["Fall"] = 2;
Season["Winter"] = 3;
Season[0] = "Spring";
Season[1] = "Summer";
Season[2] = "Fall";
Season[3] = "Winter";

在那个赛季之后可以申请:

    通过文本获取其索引(前四个属性) 通过索引获取其文本(后四个属性)

【讨论】:

但是,console.log(Seson.length) // 4 不是说 Season 是数组吗?那么,数组如何才能拥有像对象一样的“Spring”属性呢? @monad98 你问的问题是错误的。那不是编译器生成的 JavaScript:***.com/a/35075698/390330 @monad98 数组也是一个对象,有一些细节:Array.prototype.length 是最后占用的整数索引 + 1。【参考方案2】:

看起来有人只是想让赛季成为一个双向地图。

换句话说,您可以通过数字索引或字符串值来查找项目。

var season1     = Season[1];        // season1 == 'Summer'
var summerIndex = Season['Summer']; // summerIndex == 1

【讨论】:

是的。但这不是操作员所质疑的***.com/a/35075698/390330【参考方案3】:

如果您将代码块中的第一条语句更改为 var Season = []; 以使 Season 是一个数组而不是一个空对象,我将解决您的问题,为什么它仍然有效。数组也是对象,你可以在 JavaScript 中对对象设置任何你喜欢的属性,甚至是数组(只要你不通过Object.freeze 运行对象)。所以表达式Season["Spring"] = 0 只是在Season 对象上设置一个名为“Spring”的属性,您可以使用Season["Spring"]Season.Spring 访问该属性,就像在任何其他对象上一样。

【讨论】:

【参考方案4】:

如果我在第一行将 Season 更改为 empty objext,这也有效并且有意义

我有一些docs about enums,但你的问题是为什么:

Season = [];

代替

Season = ;

实际上是以下 TypeScript:

enum Season 
    Spring,
    Summer,
    Fall,
    Winter

生成the JavaScript:

var Season;
(function (Season) 
    Season[Season["Spring"] = 0] = "Spring";
    Season[Season["Summer"] = 1] = "Summer";
    Season[Season["Fall"] = 2] = "Fall";
    Season[Season["Winter"] = 3] = "Winter";
)(Season || (Season = ));

如您所见Season = 。所以它应该对你有意义。

PS:

不是你的问题,但是,如果你对 Season[Season["Spring"] = 0] = "Spring"; that is covered here 感到好奇。

【讨论】:

谢谢~!它对我理解枚举帮助很大

以上是关于在javascript数组中按值获取索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 字典中按值索引过滤项目?

如何在reactjs / javascript中按值对对象数组进行分组

在mysql json中按值删除数组元素

在 JavaScript 中按值对字典进行排序

如何使用 Hive 在 Dart 中按值(而不是按索引)读取/更新/删除?

如何在 JavaScript 中按值对地图进行排序?