Is there a generator approach to constructing a mapping (object)? I just need key/value mapping.
For generating array, I can write something like this
JavaScript
x
8
1
function* rangeA(start, stop) {
2
while(start < stop)
3
yield start++
4
}
5
6
let data = [rangeA(1, 3), rangeA(20, 22)]
7
// data is [1, 2, 20, 21]
8
Non generator approach to construct an object in a similar way can look like this
JavaScript
1
11
11
1
function rangeB(start, stop) {
2
let result = {}
3
while(start < stop) {
4
result[start] = start
5
start++
6
}
7
return result
8
}
9
let data = {rangeB(1, 3), rangeB(20, 22)}
10
// data is {1: 1, 2: 2, 20: 20, 21: 21}
11
Is there a generator approach to construct an object? Something like this
JavaScript
1
18
18
1
// DOES NOT WORK
2
function* rangeC(start, stop) {
3
while(start < stop) {
4
yield {[start]: start}
5
start++
6
}
7
}
8
let data = {rangeC(1, 3), rangeC(20, 22)}
9
// data is unfortunately an empty object
10
11
let data2 = [rangeC(1, 3), rangeC(20, 22)]
12
// data2 is obviously [{1: 1}, {2: 2}, {3: 3}, {20: 20}, {21: 21}]
13
// which is not what I want.
14
15
let data3 = data2.reduce((a, b) => ({a, b}))
16
// data3 is finally {1: 1, 2: 2, 20: 20, 21: 21}
17
// but it seems overcomplicated to me
18
Advertisement
Answer
Try using Object.fromEntries
:
JavaScript
1
9
1
function* rangeC(start, stop) {
2
while(start < stop) {
3
// Replace the curly brackets with square ones here
4
yield [start, start]
5
start++
6
}
7
}
8
let data = Object.fromEntries([rangeC(1, 3), rangeC(20, 22)])
9
For one generator, you can pass it directly:
JavaScript
1
2
1
let data = Object.fromEntries(range(1,3))
2
Or create a chain
method to process multiple:
JavaScript
1
8
1
function* chain(generators) {
2
for (let generator of generators) {
3
yield* generator;
4
}
5
}
6
7
let data = Object.fromEntries(chain(rangeC(1,3), rangeC(10,15)))
8