javascript - filtros - Usando métodos de matriz ES5 con generadores ES6
map javascript (3)
¿Cuál es la forma correcta de usar las nuevas funciones de matriz ES5 con los generadores ES6? ¿Tengo que convertir explícitamente el iterable en una matriz primero, o hay una mejor manera? Por ejemplo:
function* range(low, high) {
var i = low;
while(i < high)
yield i++;
}
// Sum of numbers in range, doesn''t work
console.log(range(0, 10).reduce((x,y) => x + y));
Como Array.from
no funciona en Chrome en este momento, necesitaba otra forma de convertir un iterador en una matriz.
(aunque, por supuesto, puedes calzarlo con un polyfill )
function iterator2Array(iterator) {
var result = [];
for (var item in iterator) {
result.push(item)
}
return result;
}
Por razones similares, agrego un "toArray" al prototipo de un Mapa, de modo que básicamente convierto un iterador en un Array para que pueda usar sus métodos orientados a funciones; por supuesto, cada elemento de la matriz será una tupla [clave, valor] (exactamente como en su Map.entries()
)
if (!Map.prototype.toArray) {
/**
* Transforms a map into an Array of ''tuples'' [[key, value], ...]
*/
Map.prototype.toArray = function () {
var result = [];
for (var item of this) {
result.push(item);
}
return result;
}
}
var m = new Map([[0, 0], [''a'', ''A'']]);
m.toArray()
Luego puede usarlo como una matriz; sin embargo, recuerde el enfoque de [clave, valor].
m.toArray().map(
function(item, index, array) {
var key = item[0],
value = item[1];
console.log(key + ": " + value);
return value;
});
Esto devolverá los valores del mapa (vale, no es superútil, por supuesto).
Si prefiere un ciclo de búsqueda más estándar:
var i = iterator.entries(),
result = [],
value;
while (value = i.next().value) {
result.push(value);
}
Las funciones del generador devuelven objetos Iterator . La API de iterador no incluye métodos de matriz de orden superior como map
, reduce
, etc., por lo que necesita construir una matriz intermedia (o usar una biblioteca como wu.js ).
Puede usar el operador de propagación para crear concisamente una matriz a partir de un iterador (finito):
var sum = [...range(0, 10)].reduce((e, i) => e + i)
Construya la matriz usando Array.from
:
console.log(Array.from(range(0, 10)).reduce((x,y) => x + y));
Array.from
crea una matriz a partir de una iterable. Consulte https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from .
Si quiere hacer la reducción sin crear la matriz, terminará necesitando hacer algo como:
var sum = 0;
for (e of range(0, 10)) sum += e;