簡體   English   中英

在ES6地圖上調用`Array.prototype.some()`的更好方法

[英]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 syntaxArray#from (樣式問題)將迭代器轉換為數組:

 const map = new Map([['a', 1], ['b', 2], ['c', 3]]); const result = [...map.values()].some((value) => value > 2); console.log(result); 

@Paulpro注釋中所述,您可以使用相同的方法來迭代Map#entriesMap#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM