【问题标题】:get index by value in javascript array在javascript数组中按值获取索引
【发布时间】: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 时会发生这种情况。
  • 其实这不是编译器生成的。看我的回答stackoverflow.com/a/35075698/390330
  • 数组是对象,因此如果您所做的只是使用方括号表示法分配属性,那么两者的行为完全相同。数组有一个特殊的长度属性,但在其他方面并不特殊(它们继承的属性大多是通用的,可以应用于任何合适的对象)。
  • @RobG 谢谢,这就是我想知道的。

标签: javascript arrays object enums typescript


【解决方案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";

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

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

【讨论】:

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

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

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

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

【讨论】:

【解决方案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 感到好奇。

    【讨论】:

    • 谢谢~!它对我理解枚举帮助很大
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多