簡體   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