我有以下代码,并且我试图通过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);
答案 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"