如何在 JavaScript 中将键映射到值,反之亦然?



我有一个如下所示的映射,我想将 1 传递给函数并获取键 a 或同时传递键"a"然后返回值 1。 通过纯JavaScript执行此操作的最佳方法是什么?

const somemap = {"a": 1, "b": 2, "c": 3};

满足以下条件:

"我想将 1 传递给函数并获取密钥 A 或同时传递密钥"A"然后返回值 1">

我将函数定义为$(obj, {needle, findAsKey = false, findAsValue = false})

哪里:

  • obj- 是搜索的对象目标
  • {needle}- 搜索词在搜索为键时应该是字符串 以及作为值搜索时的任何其他内容。
  • {findAsKey}- 一个布尔标志,说明我们是否愿意搜索 作为obj对象中的键needle。默认值为false
  • {findAsValue}- 一个布尔标志,说明我们是否愿意搜索 作为obj对象中的值needle。默认值为false

该函数返回一个包含以下属性的对象:

  • needle:用于在目标对象中进行搜索的术语。

  • asKey: 当needle在给定数组中用作键时。

如果传递的findAsKeytrue并且目标对象中存在键,则设置此属性。如果找到密钥,asKey可以具有任何值,包括nullundefinedArrayObject...

  • asValue:当needle用作给定数组中的时(如果有的话,找到第一个 prop)。

如果传递的findAsValue标志已true并且目标对象中存在该值,则设置此属性。当找到needle作为属性值时,asValue应返回合法的属性名称,因此其值只能是有效的标识符(不是undefinednull而是保存 js 约束的string)。

const somemap = {"a": 1, "b": [1,2,3], "c": 3};
console.log( $(somemap, {needle: 'a', findAsKey: true}) );
console.log( $(somemap, {needle: 'a', findAsValue: true}) );
console.log( $(somemap, {needle: 1, findAsKey: true}) );
console.log( $(somemap, {needle: 1, findAsValue: true}) );
console.log( $(somemap, {needle: 'c', findAsKey: true, findAsValue: true}) );
console.log( $(somemap, {needle: 'c', findAsKey: true, findAsValue: true}) );
console.log( $(somemap, {needle: "", findAsKey: true, findAsValue: true}) );
console.log( $(somemap, {needle: null, findAsKey: true, findAsValue: true}) );
console.log( $(somemap, {needle: undefined, findAsKey: true, findAsValue: true}) );
function $(obj, {needle, findAsKey = false, findAsValue = false}){

const result = {needle, findAsKey, findAsValue};

//set .asKey only if it was meant to be found as key
//and the property exists in obj
if(findAsKey && needle in obj)
result.asKey = obj[needle];

//if it was meant to be found as value
if(findAsValue){
//fetch the first propertyName found having that value
const asValue = ((needle)=>{
for([key, value] of Object.entries(obj))
if(value === needle)
return {result: key};
})(needle);
//set .asValue only if asValue was actually found
if(asValue !== undefined)
result.asValue = asValue.result; //no pun intended
}

return result;
}

更耗时,内存消耗更少

const somemap = {"a": 1, "b": 2, "c": 3};
console.log(getValue('b'))
console.log(getKey(2))
function getValue(key) {
return somemap[key]
}
function getKey(value) {
return Object.entries(somemap).find(([key, val]) => val === value)[0]
}

耗时更少,内存消耗更多

const somemap = {"a": 1, "b": 2, "c": 3};
const mapsome = invert(somemap)
console.log(getValue('b'))
console.log(getKey(2))
function getValue(key) {
return somemap[key]
}
function getKey(value) {
return mapsome[value]
}
function invert(obj) {
return Object.fromEntries(Object.entries(obj).map(([key, value]) => [value, key]))
}

最新更新