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

时间:2017-01-08 22:07:26

标签: javascript arrays ecmascript-6 es6-map

我最近将一些使用常规对象的代码转换为新的es6 module MyListMonad where import Control.Monad data List a = Empty | Cons a (List a) deriving (Show, Eq) instance Functor List where fmap = liftM -- boilerplate instance Applicative List where pure x = Cons x Empty -- put definition of `return` here (<*>) = ap instance Monad List where return = pure -- boilerplate (>>) = (*>) -- boilerplate xs >>= f = myConcat (myMap f xs) -- bind definition here myConcat :: List (List a) -> List a myConcat (Cons lst rest) = myAppend lst (myConcat rest) myConcat Empty = Empty myAppend :: List a -> List a -> List a myAppend (Cons x rest) ys = Cons x (myAppend rest ys) myAppend Empty ys = ys myMap :: (a -> b) -> List a -> List b myMap f (Cons x rest) = Cons (f x) (myMap f rest) myMap _ Empty = Empty test = do x <- Cons 1 $ Cons 2 $ Cons 3 Empty y <- Cons 4 $ Cons 5 $ Empty return (x * y) 类。我很快遇到了一个问题,虽然Map课程包含Map Array,但它不包含forEach方法以及其他许多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类确实包含some方法,但遗憾的是这会返回entries个对象。这不包括访问Array.prototype方法的任何简单方法。

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

3 个答案:

答案 0 :(得分:3)

使用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 :(得分:1)

Array.from对象上调用Map并在其上调用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)

答案 2 :(得分:0)

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

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

也许我可以把它扔在Map.prototype上,但这看起来非常h​​acky,我确信我必须通过添加一个d.ts文件或其他东西来使用它来使用它而不会出错。< / p>