首页 > 解决方案 > 按值查找条目键的最佳方法

问题描述

我有这个对象:

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函数吗?

[+] 此代码在封闭对象内部,不能存在其他值且每个键都是唯一的。

标签: javascript

解决方案


如果您发现自己经常这样做,您可能需要考虑反转您的地图:

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>


推荐阅读