在 es6 Map 上调用 `Array.prototype.some()` 的更好方法

Posted

技术标签:

【中文标题】在 es6 Map 上调用 `Array.prototype.some()` 的更好方法【英文标题】:Better way to call `Array.prototype.some()` on es6 Map 【发布时间】:2017-05-23 03:32:50 【问题描述】:

我最近将一些使用常规对象作为映射的代码转换为新的 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 方法的任何简单方法。

我很好奇是否有一种干净的方法可以做到这一点,或者我是否找错了树。

【问题讨论】:

***.com/questions/29886552/… 相关:***.com/questions/27612713/… 【参考方案1】:

使用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 comment 中所述,您可以使用相同的方法来迭代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);

【讨论】:

+1,另外,如果你想在测试中使用键使用map.keys(),或者如果你想要键和值都使用map.entries()并使用([key,value])作为箭头函数的签名. 没错,一种 es6 方式。除了它似乎并不比 OP 正在做的更好 不要使用扩展语法进行类型转换,使用更明确的Array.from。仅在需要构造多个元素的数组时才使用展开语法。 @Bergi - 请详细说明。 It's considered better style【参考方案2】:

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)

【讨论】:

【参考方案3】:

似乎解决此问题的最简单方法是将Map 的条目转换为Array 的某种方法,但我还没有找到任何干净的方法来做到这一点。目前我的解决方案是定义这样的方法来进行转换:

mapEntriesAsArray (map) 
    const entries = [];
    map.forEach((entry, type) => entries.push([type, entry]));
    return entries;

也许我可以把它扔到 Map.prototype 上,但这看起来很老套,我敢肯定我必须通过添加 d.ts 文件或其他东西来与 TypeScript 抗争,以使其无错误地运行。

【讨论】:

你不需要写那个函数,它已经存在了:Array.from

以上是关于在 es6 Map 上调用 `Array.prototype.some()` 的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

es6中的Set和Map

《深入理解ES6》之Set集合与Map集合

es6 map

ES6知识盲点整理

ES6 解析后端返回的Map 数据

ES6 - Map