7

我最近将一些使用常规对象作为映射的代码转换为新的 es6Map类。我很快就遇到了一个问题,虽然Map该类包含一个forEachlike Array,但它不包含一个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方法。

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

4

3 回答 3

6

使用Map#values获取值的迭代器,使用spread syntaxor 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);

于 2017-01-08T22:11:04.693 回答
1

调用对象并调用Array.from它:Mapsome

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)
于 2017-01-08T22:22:29.573 回答
0

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

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

也许我可以把它扔在上面,Map.prototype但这看起来很老套,我相信我必须通过添加一个 d.ts 文件或其他东西来与 TypeScript 抗争,以使它没有错误地运行。

于 2017-01-08T22:09:25.177 回答