【问题标题】:Create array and randomize node.js array创建数组并随机化 no​​de.js 数组
【发布时间】:2021-11-23 14:17:53
【问题描述】:

我正在尝试编写一个cisco webex 机器人,它可以让所有人进入空间(房间)并随机只写一个名字。 我有这个代码

framework.hears("daily host", function (bot) {
  console.log("Choosing a daily host");
  responded = true;
  // Use the webex SDK to get the list of users in this space
  bot.webex.memberships.list({roomId: bot.room.id})
    .then((memberships) => {
      for (const member of memberships.items) {
        if (member.personId === bot.person.id) {
          // Skip myself!
          continue;
        }

        let names = (member.personDisplayName) ? member.personDisplayName : member.personEmail;
        let arrays = names.split('\n');
        var array = arrays[Math.floor(Math.random()*items.length)];
        console.log(array)
        bot.say(`Hello ${array}`);

       }
})
    .catch((e) => {
      console.error(`Call to sdk.memberships.get() failed: ${e.messages}`);
      bot.say('Hello everybody!');
    });
});

但这不起作用。 在我使用let arrays = names.split('\n'); 后命名,以空格分隔并且没有逗号。 我想是因为什么代码不起作用 控制台日志输出:

['乔治华盛顿']

['约翰']

['威廉·霍华德·塔夫脱']

现在的主要问题是如何将输出转为数组?

【问题讨论】:

  • 我认为你没有定义 items ?是memberships.items.length 吗?
  • 你好 JBS。感谢您的回答。现在,在我将项目更改为 members.items.length 后,我得到了 3 次 Hello undefined

标签: node.js bots cisco webex


【解决方案1】:

那是因为 arrays[Math.floor(Math.random()*items.length)] 只分配一个长度为 3 的数组。您需要随机化索引并推送到数组或对原始数组使用排序函数

 var array = arrays.sort((a,b)=>{
    return Math.floor(Math.random()*arrays.length);
 });

如果您希望根据您的问题获得输出,您可以使用 reduce 而不是 sort。

var arrays = [ 'George Washington', 'John',  'William Howard Taft'];
var array = arrays.reduce((a,i)=>{
    if(!a) a = [];
        a.splice(Math.floor(Math.random()*arrays.length), 0, [i]);
    return a;
 },[]);

【讨论】:

  • 你好拉贾桑托什。感谢您的回答。我认为它有效,但输出所有 3 个名称,我只需要一个。请帮助实现这一目标。
  • @stevemaysterj 已更新答案。这是你要找的吗?
  • 你好,@Rajsanthosh Sreenivasan。感谢您的回答。但不幸的是,这并没有按预期工作。我仍然有 3 个名字,我只需要一个(
  • 添加这个:var name = array[0].toString()
  • 你好@JBS。感谢您的回答。但 bot 上的 3 个名称仍然相同。我认为这是因为let names = (member.personDisplayName) ? member.personDisplayName : member.personEmail; 将 3 个名称作为一个数组返回。像这样 ['乔治华盛顿'] ['约翰'] ['威廉霍华德塔夫脱']
【解决方案2】:

这是从数据中获取单个名称并确保它是字符串的方法。数组中只有四个名字,所以如果你一直得到相同的名字,请运行几次 sn -p。

// A list of names. Notice that Arraymond is an array; the other names are strings.
const names = [ 'George Washington', 'John',  'William Howard Taft', ['Arraymond'] ];

// Randomize the names
const randomNames = names.sort(() => Math.random() - 0.5);

// Get the first name. Make sure the name is a string (not an array)
const name = randomNames[0].toString();
 
console.log(name)

提示:不要将数组命名为“array”或“arrays”——这没有意义。使用良好的命名约定和有意义的变量名,以帮助其他人理解代码在做什么。

【讨论】:

  • 你好@JBS。然后我得到了3个数组。 console.log,正如我之前提到的,而不是 1 个数组做 3 个数组。像这样 ['George Washington'] ['John'] ['William Howard Taft'] 。主要问题是 - 如何将 3 个名称转换为 1 个字符串?
  • @stevemayster 您想要的最终输出是什么? [ 'George Washington' ] [ 'John' ] [ 'William Howard Taft' ] 或 [ 'George Washington' , 'John', 'William Howard Taft' ] 或只是名字作为字符串 'George Washington' 或名字在数组 ['乔治华盛顿'] 中。你必须非常清楚你的数据模型,上面的输出可以很容易地转换成你需要的数据模型。
  • 嗨@stevemayster,如果你运行上面的代码sn-p,你会看到一个名字。这意味着您的版本中的名称数组必须具有不同的结构。请您在原始代码中添加console.log({arrays}) ,并将结果粘贴到这里吗?
  • @stevemayster 也可以在上面的代码中找到将数组转换为字符串的答案:)
  • @JBS 输出是 { 数组:['George Washington'] } { 数组:['John']} {数组:['William Howard Taft']}
猜你喜欢
  • 2012-08-12
  • 1970-01-01
  • 2020-10-21
  • 2019-12-26
  • 2020-09-12
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多