javascript - 按值查找条目键的最佳方法
问题描述
我有这个对象:
const cOPE= { ADD: 43
, SUB: 8722
, MUL: 261
, DIV: 247
, EQU: 61
, Point: 46
, Clear: 99
}
我目前使用:
const kOPE = k => Object.entries(cOPE).find(o=>o[1]==k)[0]
根据值检索键值。例子:
console.log( kOPE(261) ) // -> MUL
有没有更好的方法来编写kOPE
函数?
不就是简单的可以返回键名的JS函数吗?
[+] 此代码在封闭对象内部,不能存在其他值且每个键都是唯一的。
解决方案
如果您发现自己经常这样做,您可能需要考虑反转您的地图:
const invert =
obj =>
Object.fromEntries(
Object.entries(obj)
.map(([k, v]) => [v, k]));
const cOPE =
{ ADD: 43
, SUB: 8722
, MUL: 261
, DIV: 247
, EQU: 61
, Point: 46
, Clear: 99
};
const EPOc = invert(cOPE);
EPOc[261];
//=> MUL
表现
如果您确实担心性能,则绝对应该使用倒置映射。
这是一个 curried 版本,invert
它返回一个函数,该函数接受一个值并返回与其关联的键。它绑定到由obj
.
使用 Rick Hitchcock 的相同test
功能:
const invert =
obj => ((o, v) => o[v])
.bind(null,
Object.fromEntries(
Object.entries(obj)
.map(([k, v]) => [v, k])));
const cOPE =
{ ADD: 43
, SUB: 8722
, MUL: 261
, DIV: 247
, EQU: 61
, Point: 46
, Clear: 99
};
test(invert(cOPE), 43);
test(invert(cOPE), 261);
test(invert(cOPE), 99);
<script>
// Credits to Rick Hitchcock for the test function
const test = (fnc, num) => {
let j;
console.time('speedTest')
for (let i = 0; i < 1000000; i++) { j = fnc(num) }
console.timeEnd('speedTest')
}
</script>
推荐阅读
- mysql - 下面的查询有什么问题 Select CONVERT(xml,'
' + 替换(A.name,':',' ')+' ' ) 作为来自 Erecharge 的 xDim; - typescript - 列出其他设备 Ionic 的文件
- android - 使用 Retrofit 获取 json 响应数据的问题
- python - 创建数据透视表时出现 Pandas 错误 (KeyError)
- hyperledger-fabric - fabric-ca-server is not able to start with softhsm configuration
- webpack - 告诉 webpack 某些 node_module 是无副作用的
- android - 我们如何从 android studio 的 sql 数据库中接收特定的行
- android - Transloadit Dependency has different version for the compile (x) and runtime (y)
- javascript - 为什么 array[0] = array[0].toUpperCase() 工作,而 array[0][0] = array[0][0].toUpperCase() 不是
- bash - Shell - 表达式中的语法错误(错误标记为“16”)