如何在对象创建中包含循环?

时间:2021-06-09 16:46:57

标签: javascript

我正在尝试创建一个对象以在 HTML 的各个地方使用。它有点像这样:

MovieInfo = {
            title: Movie.value[0].title,
            meta: [
              {
                name: "description",
                content: Movie.value[0].description,
              },
              {
                name: "date",
                content: Movie.value[0].releasedate
              },
              // Try to add objects from another array
             Movie.value[1].forEach(function (Cast, index) {
             return {
                key: Cast.actorname, property: "article:tag", content: Cast.actorname
              }
          })
            ]
}

以上方法无效。但是,如果我在创建 push 对象后 metaMovieInfo 数组,那么它确实可以工作,如下所示:

MovieInfo = {
                title: Movie.value[0].title,
                meta: [
                  {
                    name: "description",
                    content: Movie.value[0].description,
                  },
                  {
                    name: "date",
                    content: Movie.value[0].releasedate
                  },
                 
                ]
    }

              // Try to add objects from another array
                 Movie.value[1].forEach(function (Cast, index) {
                 MovieInfo.meta.push({
                    key: Cast.actorname, property: "article:tag", content: Cast.actorname
                  })
              })

我必须在不同的区域做很多这样的循环,所以我更喜欢在创建 MovieInfo 时完成它们而不是在它之外完成。那可能吗?也就是说,是否可以通过在对象创建本身内部设置循环来使我的第一次尝试成功?

1 个答案:

答案 0 :(得分:2)

您可以使用 IIFE 在对象字面量(或实际上,任何表达式)中执行任意操作:

const MovieInfo = {
  title: Movie.value[0].title,
  meta: (() => {
    const meta = [
      {
        name: "description",
        content: Movie.value[0].description,
      },
      {
        name: "date",
        content: Movie.value[0].releasedate
      },
    ];
    for (const cast of Movie.value[1]) {
      meta.push({
        key: cast.actorname,
        property: "article:tag",
        content: cast.actorname
      });
    }
    return meta;
  })(),
};

在这种情况下,我建议您使用 concatmap 简单地构建数组:

const MovieInfo = {
  title: Movie.value[0].title,
  meta: [
    {
      name: "description",
      content: Movie.value[0].description,
    },
    {
      name: "date",
      content: Movie.value[0].releasedate
    },
  ].concat(Movie.value[1].map(cast => ({
    key: cast.actorname,
    property: "article:tag",
    content: cast.actorname
  }))),
};
相关问题