6 回答
TA贡献1853条经验 获得超6个赞
也许是这样的:
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));
}
TA贡献1817条经验 获得超14个赞
如果你真的想避免for loop,你可以改用Array#reduce。
var obj = {'low': [1, 2, 3], 'medium': [4, 5, 6], 'high': [7, 8, 9, 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));
TA贡献1875条经验 获得超3个赞
您可以使用Object.keys、Object.values、Array#findIndex和Array#some来完成。
var obj = {'low': [1, 2, 3], 'medium': [4, 5, 6], 'high': [7, 8, 9, 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));
TA贡献1835条经验 获得超7个赞
您正在寻找与基本对象不同的数据结构。看看双向地图。这是一种数据结构,允许您通过键查找值,并通过值查找键。
我可以推荐这个实现。它是mnemonist的一部分,它有一堆方便的数据结构用于不同的用例!
import BiMap from 'mnemonist/bi-map';
const obj = {'low': [1, 2, 3], 'medium': [4, 5, 6], 'high': [7, 8, 9, 10]};
const lookupTable = BiMap.from(obj);
console.log(lookupTable.get('low'))
// > [1,2,3]
console.log(lookupTable.inverse.get([1,2,3]))
// > 'low'
TA贡献1880条经验 获得超4个赞
没有自定义方法就不可能做到这一点,有很多方法可以完成你想要的。
这种方法使用Proxy对象通过访问的属性查找键并保留条目以便能够提供快速访问。
const obj = {'low': [1, 2, 3], 'medium': [4, 5, 6], 'high': [7, 8, 9, 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]);
TA贡献1798条经验 获得超3个赞
您可以定义一个函数来根据传递的值返回键。该函数使用 Object.keys 和 Array.find()
var obj = {'low': [1, 2, 3], 'medium': [4, 5, 6], 'high': [7, 8, 9, 10]};
const findKeyByValue = (value)=>{
return Object.keys(obj).find(key => obj[key].find(element => element === value))
}
console.log(findKeyByValue(8))
添加回答
举报
