繁体   English   中英

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

[英]Using Object.keys with array of values

给定以下对象

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

您可以使用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));

您可以定义一个函数来根据传递的值返回键。 该函数使用 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))

没有自定义方法就不可能做到这一点,有很多方法可以完成您想要的。

这种方法使用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]);

您正在寻找与基本对象不同的数据结构。 看看双向映射 这是一种数据结构,允许您按键查找值,按值查找键。

我可以推荐这个实现 它是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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM