我有一个如下所示的映射,我想将 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
在给定数组中用作键时。
如果传递的findAsKey
已true
并且目标对象中存在键,则设置此属性。如果找到密钥,asKey
可以具有任何值,包括null
、undefined
、Array
、Object
...
asValue
:当needle
用作给定数组中的值时(如果有的话,找到第一个 prop)。
如果传递的findAsValue
标志已true
并且目标对象中存在该值,则设置此属性。当找到needle
作为属性值时,asValue
应返回合法的属性名称,因此其值只能是有效的标识符(不是undefined
或null
而是保存 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]))
}