[英]Better way to call `Array.prototype.some()` on es6 Map
我最近將一些使用常規對象作為映射的代碼轉換為新的es6 Map
類。 我很快遇到了一個問題,盡管Map
類包括一個Array
類的forEach
,但它不包含some
方法以及許多其他Array.prototype
方法。
為了提供一些上下文,帶有常規JS對象的原始代碼如下所示:
var map = {
entry1: 'test',
entry2: 'test2'
};
Object.keys(map).some(key => {
var value = map[key];
// Do something...found a match
return true;
});
Map
類確實包含一個entries
方法,但可悲的是,它返回了Iterator
對象。 這也不包括訪問Array.prototype
方法的任何簡單方法。
我很好奇是否有一種干凈的方法可以做到這一點,或者我是否在吠錯樹。
使用Map#values
獲取Map#values
的迭代器,然后使用spread syntax
或Array#from
(樣式問題)將迭代器轉換為數組:
const map = new Map([['a', 1], ['b', 2], ['c', 3]]); const result = [...map.values()].some((value) => value > 2); console.log(result);
如@Paulpro注釋中所述,您可以使用相同的方法來迭代Map#entries
和Map#keys
。 例如,使用Array#reduce
將Map轉換為對象。 當Array#from
調用Map#entries
我們不需要顯式調用它:
const map = new Map([['a', 1], ['b', 2], ['c', 3]]); const result = Array.from(map.entries()).reduce((obj, [key, value]) => { obj[key] = value; return obj; }, {}); console.log(result);
在Map
對象上調用Array.from
並在其上調用some
:
Array.from(map).some(([key, value]) => /* something */ true)
當然,這是非常低效的。 一個更好的主意是定義some
函數, 它在任何工作的迭代器,如的那些Map
提供:
function some(it, pred) {
for (const v of it)
if (pred(v))
return true;
return false;
}
some(map.values(), value => /* something */ true)
看來,解決此問題的最簡單方法是某種將Map
的條目轉換為Array
但是我還沒有找到任何一種干凈的方法來做到這一點。 目前,我的解決方案是定義一個類似這樣的方法來進行轉換:
mapEntriesAsArray (map) {
const entries = [];
map.forEach((entry, type) => entries.push([type, entry]));
return entries;
}
也許我可以將其Map.prototype
上,但這似乎很hacky,而且我確信我必須通過添加d.ts文件或其他使它輕松無誤的方式與TypeScript進行斗爭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.