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))
添加回答
舉報