如何将相同的数据多次存储在数组中?
How to store same data in array multiple times?
我从 this api 收到音频 URL 和一些文本。到目前为止,我可以使用 webhook 在 dialogflow 上获得此响应。
现在我需要多次获取相同的数据。例如,到目前为止,如果我要求 播放音频 ,它 提供 url 1 次 。现在我希望它 return URL 多次 例如当我要求它播放音频 2 次或 100 次时它应该给 url相应地。
URLs 必须以与我相同的方式存储在数组中。
我将包含“url”、“title”和“type”的对象推送到名为 'messages' 的数组中。它应该被推送到特定的号码。我指定使用 'times' 变量的次数。
这是我尝试过的方法。请检查环路是否放置正确?这个函数没有循环和returns数据一次就可以了。如果需要任何其他详细信息,请告诉我。
代码
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`
})
}
}
完成响应
变量ayahs
是一个包含两个对象的数组,只有第一个对象包含音频url(尝试在浏览器中打开http://api.alquran.cloud/v1/ayah/2:286/editions/ar.alafasy,en.asad以查看响应) .您当前正在遍历这两个对象,并将两个对象的音频 url 附加到数组对象的 url 属性 ,它只工作一次的原因是因为音频url 存在于第一个对象上 only.You 需要消除第一个 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"
})
这样您就不必使用循环,也不会发送不必要的负载。
我从 this api 收到音频 URL 和一些文本。到目前为止,我可以使用 webhook 在 dialogflow 上获得此响应。
现在我需要多次获取相同的数据。例如,到目前为止,如果我要求 播放音频 ,它 提供 url 1 次 。现在我希望它 return URL 多次 例如当我要求它播放音频 2 次或 100 次时它应该给 url相应地。
URLs 必须以与我相同的方式存储在数组中。
我将包含“url”、“title”和“type”的对象推送到名为 'messages' 的数组中。它应该被推送到特定的号码。我指定使用 'times' 变量的次数。
这是我尝试过的方法。请检查环路是否放置正确?这个函数没有循环和returns数据一次就可以了。如果需要任何其他详细信息,请告诉我。
代码
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`
})
}
}
完成响应
变量ayahs
是一个包含两个对象的数组,只有第一个对象包含音频url(尝试在浏览器中打开http://api.alquran.cloud/v1/ayah/2:286/editions/ar.alafasy,en.asad以查看响应) .您当前正在遍历这两个对象,并将两个对象的音频 url 附加到数组对象的 url 属性 ,它只工作一次的原因是因为音频url 存在于第一个对象上 only.You 需要消除第一个 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"
})
这样您就不必使用循环,也不会发送不必要的负载。