为了账号安全,请及时绑定邮箱和手机立即绑定

将 Object.keys 与值数组一起使用

将 Object.keys 与值数组一起使用

忽然笑 2023-03-03 14:56:32
给定以下对象var obj = {'low': [1, 2, 3], 'medium': [4, 5, 6], 'high': [7, 8, 9, 10]}是否有可能使用Object.keys(无循环)通过相应值之一获取键(低/中/高)?
查看完整描述

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));

}


查看完整回答
反对 回复 2023-03-03
?
大话西游666

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));


查看完整回答
反对 回复 2023-03-03
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您可以使用Object.keysObject.valuesArray#findIndexArray#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));


查看完整回答
反对 回复 2023-03-03
?
qq_花开花谢_0

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'


查看完整回答
反对 回复 2023-03-03
?
慕村225694

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]);


查看完整回答
反对 回复 2023-03-03
?
呼如林

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))


查看完整回答
反对 回复 2023-03-03
  • 6 回答
  • 0 关注
  • 260 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号