【问题标题】:How to store same data in array multiple times?如何将相同的数据多次存储在数组中?
【发布时间】:2019-05-01 20:18:40
【问题描述】:

我从this api 获得一个音频 URL 和一些文本。到目前为止,我可以使用 webhook 在 dialogflow 上获得此响应。

现在我需要多次获取相同的数据。例如,到目前为止,如果我要求播放音频,它提供 url 1 次。现在我希望它多次返回 URL,例如当我要求它播放音频 2 次或 100 次时,它应该相应地给出 url。

URL 必须以与我相同的方式存储在数组中。

我将包含“url”、“title”和“type”的对象推送到名为“messages”的数组中。它应该被推到特定的号码。我使用 'times' 变量指定的次数。

这是我尝试过的。请检查循环是否放置正确?这个函数没有循环就很好,只返回一次数据。如果需要任何其他细节,请告诉我。

代码

static readAyahOfSurahMultipleTimes = async (agent: any) => {
      

           const params = agent.parameters
           console.log("params: ", params)
  
           let surahApi: any = await http.get(`http://api.alquran.cloud/v1/ayah/${params.surahName}:${params.ayahNumber}/editions/ar.alafasy,en.asad`);
           
           var ayahs: any = surahApi["data"];  
           console.log("ayahs", ayahs);
      
           let payload = {
               "web": {     
                   "messages": []
               }
           }
           try {
               ayahs.forEach(function (item) {
                   for(var i=0;i<params.times;i++){
                   payload.web.messages.push({                              
                       "url": item.audio,
                      // "title": item.text,
                      "title": surahApi["data"][0]["text"],
                       "type": "audio",
                   }) 
                }
               });
               console.log("payload", payload);
               console.log("payload.web.messages",payload.web.messages);
      
      
               raw.response.send({
      
                   "fulfillmentText": `Ayah number ${params.ayahNumber} of surah number ${params.surahName} is being played`,   
                   "payload": payload
               })
               return;
           } catch (e) {
               console.log("error in catch block", e);
               raw.response.send({
                   "fulfillmentText": `response from catch`
               })
           }
       }

履行响应

【问题讨论】:

  • 每次需要重播音频时,您是否在“消息”数组中推送“有效负载”对象?
  • 我将包含“url”、“title”和“type”的对象推送到“messages”数组中。它应该被推到没有。我使用 'times' 变量指定的次数

标签: typescript loops dialogflow-es array-push


【解决方案1】:

变量ayahs是一个包含两个对象的数组,只有第一个对象包含音频url(尝试在浏览器中打开http://api.alquran.cloud/v1/ayah/2:286/editions/ar.alafasy,en.asad查看响应)。您当前正在遍历这两个对象,并将两个对象的音频 url 附加到数组对象的 url 属性,它只工作一次的原因是因为音频 url 仅存在于第一个对象上。您需要消除第一个forEach 循环并通过ayahs 数组的第一个元素访问音频。

static readAyahOfSurahMultipleTimes = async (agent: any) => {

     const params = agent.parameters

     let surahApi: any = await http.get(`http://api.alquran.cloud/v1/ayah/${params.surahName}:${params.ayahNumber}/editions/ar.alafasy,en.asad`);

     var ayahs: any = surahApi["data"];  


     let payload = {
        "web": {     
            "messages": []
        }
     }

     try {
        let ayah: any = ayahs[0];
        let audio:string = ayah.audio;

        for(var i=0; i<params.times; i++){
           payload.web.messages.push({                              
              "url": audio,
              "title": surahApi["data"][0]["text"],
              "type": "audio",
           }) 
        }          

        raw.response.send({
           "fulfillmentText": `Ayah number ${params.ayahNumber} of surah number ${params.surahName} is being played`,   
           "payload": payload
        })

        return;
     } 
     catch (e) {
       raw.response.send({
          "fulfillmentText": `response from catch`
        })
     }
  }

现在我认为通过复制消息数组上的数据所做的事情是没有意义的,您可以简单地在有效负载对象中添加音频需要重复的次数的属性,然后将其配置为客户端使用此变量重复多次。

payload.web.messages.push({                              
   "url": audio,
   "title": surahApi["data"][0]["text"],
   "repititionTimes": params.times
   "type": "audio"
})

这样您就不必使用循环,也不会发送不必要的有效负载。

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 2023-04-09
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多