JavaScript对象生成器

发布于 2025-02-13 17:08:33 字数 1195 浏览 3 评论 0原文

是否有构造映射(对象)的生成器方法?我只需要键/值映射。

对于生成数组,我可以写类似于这种

function* rangeA(start, stop) {
  while(start < stop)
    yield start++
}

let data = [...rangeA(1, 3), ...rangeA(20, 22)]
// data is [1, 2, 20, 21]

非发电机的方法来以类似的方式构造对象,看起来

function rangeB(start, stop) {
  let result = {}
  while(start < stop) {
    result[start] = start
    start++
  }
  return result
}
let data = {...rangeB(1, 3), ...rangeB(20, 22)}
// data is {1: 1, 2: 2, 20: 20, 21: 21}

是否有一个生成器方法来构造对象?类似的东西

// DOES NOT WORK
function* rangeC(start, stop) {
  while(start < stop) {
    yield {[start]: start}
    start++
  }
}
let data = {...rangeC(1, 3), ...rangeC(20, 22)}
// data is unfortunately an empty object

let data2 = [...rangeC(1, 3), ...rangeC(20, 22)]
// data2 is obviously [{1: 1}, {2: 2}, {3: 3}, {20: 20}, {21: 21}]
// which is not what I want.

let data3 = data2.reduce((a, b) => ({...a, ...b}))
// data3 is finally {1: 1, 2: 2, 20: 20, 21: 21}
// but it seems overcomplicated to me

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

function* rangeA(start, stop) {
  while(start < stop)
    yield start++
}

let data = [...rangeA(1, 3), ...rangeA(20, 22)]
// data is [1, 2, 20, 21]

Non generator approach to construct an object in a similar way can look like this

function rangeB(start, stop) {
  let result = {}
  while(start < stop) {
    result[start] = start
    start++
  }
  return result
}
let data = {...rangeB(1, 3), ...rangeB(20, 22)}
// data is {1: 1, 2: 2, 20: 20, 21: 21}

Is there a generator approach to construct an object? Something like this

// DOES NOT WORK
function* rangeC(start, stop) {
  while(start < stop) {
    yield {[start]: start}
    start++
  }
}
let data = {...rangeC(1, 3), ...rangeC(20, 22)}
// data is unfortunately an empty object

let data2 = [...rangeC(1, 3), ...rangeC(20, 22)]
// data2 is obviously [{1: 1}, {2: 2}, {3: 3}, {20: 20}, {21: 21}]
// which is not what I want.

let data3 = data2.reduce((a, b) => ({...a, ...b}))
// data3 is finally {1: 1, 2: 2, 20: 20, 21: 21}
// but it seems overcomplicated to me

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

笑梦风尘 2025-02-20 17:08:33

尝试使用代码>

function* rangeC(start, stop) {
  while(start < stop) {
    // Replace the curly brackets with square ones here
    yield [start, start]
    start++
  }
}
let data = Object.fromEntries([...rangeC(1, 3), ...rangeC(20, 22)])

对于一个发电机,您可以直接传递:

let data = Object.fromEntries(range(1,3))

或创建一个链条处理多个处理方法:

function* chain(...generators) {
    for (let generator of generators) {
        yield* generator;
    }
}

let data = Object.fromEntries(chain(rangeC(1,3), rangeC(10,15)))

Try using Object.fromEntries:

function* rangeC(start, stop) {
  while(start < stop) {
    // Replace the curly brackets with square ones here
    yield [start, start]
    start++
  }
}
let data = Object.fromEntries([...rangeC(1, 3), ...rangeC(20, 22)])

For one generator, you can pass it directly:

let data = Object.fromEntries(range(1,3))

Or create a chain method to process multiple:

function* chain(...generators) {
    for (let generator of generators) {
        yield* generator;
    }
}

let data = Object.fromEntries(chain(rangeC(1,3), rangeC(10,15)))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文