问题描述
给出以下对象
var obj = {'low': [1,2,3],'medium': [4,5,6],'high': [7,8,9,10]}
是否可以使用Object.keys
(无循环)通过相应的值之一获取键(低/中/高)?
谢谢。
解决方法
也许是这样的:
var obj = {'low': [1,2,3],'medium': [4,5,6],'high': [7,8,9,10]};
function getKey(n) {
return Object.keys(obj).find(k => obj[k].includes(n));
}
,
如果您真的想避免使用for loop
,可以改用Array#reduce
。
var obj = {'low': [1,10]};
const fn = (value,arr) =>
Object.entries(arr)
.reduce((s,[key,a]) => (a.indexOf(value) > -1 ? key : s),null);
console.log(fn(7,obj));
console.log(fn(1,obj));
,
您可以使用Object.keys,Object.values,Array#findIndex和Array#some来做到这一点。
var obj = {'low': [1,10]};
function mySearch(obj,search) {
return Object.keys(obj)[(Object.values(obj).findIndex(el => el.some(val => val===search)))];
}
console.log(mySearch(obj,5));
console.log(mySearch(obj,8));
,
您可以定义一个函数,以根据传递的值返回键。 该函数使用Object.keys和Array.find()
var obj = {'low': [1,10]};
const findKeyByValue = (value)=>{
return Object.keys(obj).find(key => obj[key].find(element => element === value))
}
console.log(findKeyByValue(8))
,
没有自定义方法就不可能做到这一点,有很多方法可以完成您想要的事情。
此方法使用Proxy
对象通过所访问的属性查找密钥,并使条目保持快速访问的能力。
const obj = {'low': [1,10]},decorate = (o) => {
const entries = Object.entries(o);
return new Proxy(o,{
get(_,accessedProperty) {
let [key] = (entries.find(([_,values]) => values.includes(+accessedProperty)) || []);
return key;
}
});
},decoratedObj = decorate(obj);
console.log(decoratedObj[1]);
console.log(decoratedObj[4]);
console.log(decoratedObj[10]);
console.log(decoratedObj[11]);
,
您正在寻找与基本对象不同的数据结构。看看bidirectional map。这是一种数据结构,可让您通过键值来查找值,并通过键值来查找键。
我可以推荐this implementation。它是mnemonist的一部分,其中有许多方便的数据结构,可用于不同的用例!
import BiMap from 'mnemonist/bi-map';
const obj = {'low': [1,10]};
const lookupTable = BiMap.from(obj);
console.log(lookupTable.get('low'))
// > [1,3]
console.log(lookupTable.inverse.get([1,3]))
// > 'low'