微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Javascript-将Object.keys与值数组一起使用

给出以下对象

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.keysObject.valuesArray#findIndexArray#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'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。