在 es6 地图上调用 `Array.prototype.some()` 的更好方法
Better way to call `Array.prototype.some()` on es6 Map
我最近将一些使用常规对象作为映射的代码转换为新的 es6 Map
class。我很快遇到了一个问题,因为 Map
class 包含一个 forEach
like Array
, it does not include a 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
class 确实包含一个 entries
method but sadly this returns an Iterator
对象。这也不包括访问 Array.prototype
方法的任何简单方法。
我很好奇是否有一种干净的方法可以做到这一点,或者我是否找错了树。
解决这个问题的最简单方法似乎是某种将 Map
的条目转换为 Array
的方法,但我还没有找到任何干净的方法来做到这一点.目前我的解决方案是定义一个这样的方法来进行转换:
mapEntriesAsArray (map) {
const entries = [];
map.forEach((entry, type) => entries.push([type, entry]));
return entries;
}
也许我可以把它放在 Map.prototype
上,但这看起来很老套,我敢肯定我必须通过添加 d.ts 文件或其他东西来与 TypeScript 作斗争,让它变得活跃起来没有错误。
使用Map#values
to get an iterator of the values, and the spread syntax
or Array#from
(风格问题)将迭代器转换为数组:
const map = new Map([['a', 1], ['b', 2], ['c', 3]]);
const result = [...map.values()].some((value) => value > 2);
console.log(result);
如 you can use the same method to iterate Map#entries
, and 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)
我最近将一些使用常规对象作为映射的代码转换为新的 es6 Map
class。我很快遇到了一个问题,因为 Map
class 包含一个 forEach
like Array
, it does not include a 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
class 确实包含一个 entries
method but sadly this returns an Iterator
对象。这也不包括访问 Array.prototype
方法的任何简单方法。
我很好奇是否有一种干净的方法可以做到这一点,或者我是否找错了树。
解决这个问题的最简单方法似乎是某种将 Map
的条目转换为 Array
的方法,但我还没有找到任何干净的方法来做到这一点.目前我的解决方案是定义一个这样的方法来进行转换:
mapEntriesAsArray (map) {
const entries = [];
map.forEach((entry, type) => entries.push([type, entry]));
return entries;
}
也许我可以把它放在 Map.prototype
上,但这看起来很老套,我敢肯定我必须通过添加 d.ts 文件或其他东西来与 TypeScript 作斗争,让它变得活跃起来没有错误。
使用Map#values
to get an iterator of the values, and the spread syntax
or Array#from
(风格问题)将迭代器转换为数组:
const map = new Map([['a', 1], ['b', 2], ['c', 3]]);
const result = [...map.values()].some((value) => value > 2);
console.log(result);
如 Map#entries
, and 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)