如何读取JavaScript枚举值

时间:2019-03-27 19:02:16

标签: javascript

我有以下代码,并且我试图通过int来获取值

const fruit = Object.freeze({ Apple: 0, Banana: 1, Cherry: 2});
const myFruit = 1;

alert(fruit[myFruit]);//undefined

alert(fruit(myFruit));//not a function (obviously)

我希望警报提供水果的名称,因此在这种情况下,警报香蕉为1。

这可能吗?我没有使用任何框架,所以请不要使用JQuery / Angular / React等。只需使用Javascript。

我是否必须遍历才能找到匹配项,因为以下方法也不起作用:

alert(fruit.length);

5 个答案:

答案 0 :(得分:2)

  

我是否必须遍历才能找到匹配项...

是的。对象按属性名称提供查找,但不按属性值提供查找。例如:

const fruitName = Object.keys(fruit).find(name => fruit[name] === myFruit);

实时示例:

const fruit = Object.freeze({ Apple: 0, Banana: 1, Cherry: 2});
const myFruit = 1;

const fruitName = Object.keys(fruit).find(name => fruit[name] === myFruit);

console.log(fruitName);

这将获得属性名称的数组,然后使用Array.prototype.find查找与myFruit具有匹配值的第一个。

答案 1 :(得分:1)

您应该使用键而不是值:

 fruit["Banana"]

要在对象中进行搜索,您可以像这样进行处理:

const fruit = Object.freeze({
  Apple: 0,
  Banana: 1,
  Cherry: 2
});
const myFruit = 1;

console.log("expected return undefined =>", fruit[1]);

console.log("expected return 1 =>", fruit["Banana"]);

// to do search 


Object.keys(fruit).forEach(el => {

  if (fruit[el] === myFruit)
    console.log(el)
})

答案 2 :(得分:1)

这是打字稿处理enums的方式。创建一个对象,该对象将Apple键指向0,并将0指向Apple。因此,它可以双向工作。这样,您不必遍历对象的键并每次都使用数字取回键

const fruit = {};
fruit[fruit["Apple"] = 0] = "Apple";
fruit[fruit["Banana"] = 1] = "Banana";
fruit[fruit["Cherry"] = 2] = "Cherry";

console.log(fruit.Banana)
console.log(fruit[2])

那只是一种奇特的写作方式:

const fruit = {
  Apple: 0,
  Banana: 1,
  Cherry: 2,
  0: "Apple",
  1: "Banana",
  2: "Cherry"
}

答案 3 :(得分:0)

嗨,尝试一下:

const fruit = Object.freeze({
  Apple: 0,
  Banana: 1,
  Cherry: 2
});
const myFruit = 1;

Object.keys(fruit).forEach((name) => {if(fruit[name] === myFruit) alert(name)})

答案 4 :(得分:0)

JavaScript本身没有枚举,也没有通过值访问对象的属性名的明显方法。但是,如果您愿意让代码看起来有些有趣,则可以尝试执行TypeScript在将枚举编译为JavaScript对象时所做的事情。

// TypeScript code…
enum Fruits {
    Apple, Banana
}

// … compiles to this JavaScript.
var Fruits;
(function (Fruits) {
    Fruits[Fruits["Apple"] = 0] = "Apple";
    Fruits[Fruits["Banana"] = 1] = "Banana";
})(Fruits || (Fruits = {}));

它基本上同时为它的值分配一个键,然后将该值变成保留原始键的键。这样,您可以访问此地图并获取所需的名称。

const myFruit = 1
Fruit[myFruit] // => "Banana"

在实现上明智的做法是,您可以使用类似的方法来避免机器生成的代码“令人讨厌”。

function createEnum(enumeration) {
  const result = Object
    .entries(enumeration)
    .reduce((result, [key, value]) => {
      result[result[key] = value] = key
      return result
    }, {})
  return Object.freeze(result)
}

const fruits = createEnum({Apple: 0, Banana: 1})

fruits[1] // => "Banana"