【问题标题】:Add two more keys and values to a requested array of objects with the same values?向请求的具有相同值的对象数组添加另外两个键和值?
【发布时间】:2019-08-12 13:04:07
【问题描述】:

我正在使用 Node.js 向 Vimeo API 发出 Axios 请求。

我是 Json 的菜鸟,但我想了解。我用名称过滤器调用了 Vimeo,所以我得到了一个“对象数组”(我希望名称是正确的),如下所示:

 [{ name: 'A Personalized Goal for Anthony' },

 { name: 'Flow access & overview' },

 { name: 'Welcome - 2018 Conference' },

 { name: 'Dropout Video' } ] }

这只是视频的名称,但是我需要添加两个键值对,其值与下拉菜单的名称值相同,因此如下所示:

[{ name: 'A Personalized Goal for Anthony',
 "text": "A Personalized Goal for Anthony",
 "value": "A Personalized Goal for Anthony"  },

 { name: 'Flow access & overview',
   "text": "Flow access & overview"
   "value": "Flow access & overview" },

 { name: 'Welcome - 2018 Conference',
   "text": "Welcome - 2018 Conference"
   "value": "Welcome - 2018 Conference" },

 { name: 'Dropout Video',
   "text": "Welcome - 2018 Conference"
   "value": "Welcome - 2018 Conference" }] 

我的应用需要下拉菜单的“文本”和“值”键来处理用户的响应。

我不确定为什么 { name: 'Dropout Video'} 的格式不是这样 {"name":"Dropout Video"},

Node.js 中是否有一种方法可以使用 map 添加或复制数组,或者使用相同的 name 值推送,同时对该数组执行 foreach 以反映名称但具有两个具有相同 Value 的附加键值对键名?

这也是一个动态对象,因此当再次调用请求时,它可能返回的不仅仅是 4 个视频名称。

我的目标是将大量视频添加到我想要发出请求的 Vimeo 相册中,然后我的应用 (Slack 聊天机器人) 然后通过下拉菜单返回选项列表用户考虑,以便我能够看到他们选择了哪个名称或标题,因此需要更多信息。

非常感谢您在这里提供的任何帮助。我希望 Vimeo 有一个 Text 和 Value 字段,这样我就可以过滤它,但那样就不好玩了 :)

【问题讨论】:

  • 我的日志现在只显示 [{"name":"STEM HI Shorter version","link":"vimeo.com/28736453"}] 但是我无法定位链接值?无论出于何种原因,myJSON.link 或 myJSON[0].link 都无法正常工作,我正在摸不着头脑。当我做 console.log(myJSON.link) 我得到 [Function: link]

标签: node.js json dictionary object foreach


【解决方案1】:

你可以映射你的结果,例如,在你得到结果之后:

    const movies =  [{ name: 'A Personalized Goal for Anthony' },
    { name: 'Flow access & overview' },
    { name: 'Welcome - 2018 Conference' },
    { name: 'Dropout Video' }];

您可以映射它以将其他两个属性添加到每个对象,优点是您不会改变结果。

    const mappedMovies = movies.map(movie => {
      return {
        name: movie.name,
        text: movie.name,
        value: movie.name
      }
    );

这样,您将获得具有所需格式的对象列表,现在如果您需要 json 格式的对象,您可以这样做:

    const JSONString = JSON.stringify(mappedMovies);

【讨论】:

  • 非常感谢你,我已经尝试过其他人的回复,但你的回复是我唯一理解的足以获得我想要的结果的回复!我相信其他人也很好。谢谢你们!这么多
【解决方案2】:

对象是引用,所以你可以遍历你的对象并添加键。

const videos = [
  { name: 'A Personalized Goal for Anthony' },
  { name: 'Flow access & overview' },
  { name: 'Welcome - 2018 Conference' },
  { name: 'Dropout Video' }
]

for (video of videos) {
    video.text = video.name
    video.value = video.name 
}

console.log(videos)

【讨论】:

  • 感谢 Francios 的帮助,但是我在日志中遇到了打字错误,它确实有很大帮助,所以也谢谢你。
【解决方案3】:

欢迎来到 SO Kevin,

看起来你几乎已经自己提供了答案......

要获得结果数组,您可以映射对象并根据需要添加键:

const slackVideos = videos.map(function (item, label) {
    return {
        ...item, //this ensures all original keys are available, using the ES6 destructuring
        text: item.name,
        value: item.value,
    }
});

假设 videos 是从 vimeo 收到的对象,slackVideos 现在将包含您的附加 textvalue 键;两者都包含来自原始 vimeo 对象的 name 键。

【讨论】:

  • 乔纳斯,谢谢!你的回复似乎也很接近,如果我足够理解它,我可能已经让它工作了。我还必须添加 movies.data.map(movies => 我必须添加 .data 因为它返回 .map 不是函数,我不明白。
  • 不客气;关于I'm not sure why { name: 'Dropout Video'}, isn't formatted like this {"name":"Dropout Video"},,前者是大多数javascript解析器显示js对象的方式,后者是json格式(基于js对象,但不完全相同)。由于接收 vimeo 数据的方式,您可能需要 .data
  • nvm,我一时傻了。谢谢。我删除了一些 json 的东西
  • 没问题。一个小小的提醒,SO/Stack Exchange 上的常见礼貌是支持对您有帮助的答案(和 cmets),并将 solution 标记为已接受的答案?
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2021-10-09
  • 2020-08-23
  • 2022-11-18
  • 1970-01-01
  • 2018-05-22
相关资源
最近更新 更多