在随机投票我的问题并建议我使用拼接可能实际上读了我正在尝试做的事情。谢谢。
我正在编写node.js聊天机器人以及删除数组中特定元素所需的命令之一。
命令应该如何工作:
项目'foo','bar','baz'被添加到名为raidLoot的数组中。对于这些数组元素中的每一个,都会创建一个用户可以添加的数组,并为每个数组选择一个随机用户。因此,如果我有raidLoot = [foo]和第二个名为foo = [userA,userB,userC]的数组,则在选择其中一个用户后,应从raidLoot中删除“foo”。
这是相关代码
case 'loot':
query(connection, 'SELECT * FROM channel WHERE name = "' + userName + '"').done(function (result) {
if (result[0].length !== 0) {
if (args[1] === 'clear') {
raidLoot = []
send_PRIVGRP_MESSAGE(botId, userName + ' cleared the loot list')
} else {
raidLoot.push(args.slice(1).join(' '))
send_PRIVGRP_MESSAGE(botId, userName + ' added ' + args.slice(1).join(' ') + ' to slot #' + raidLoot.length + '. Use !add ' + raidLoot.length + ' to join ')
lootSlot[raidLoot.length] = []
}
} else {
send_MESSAGE_PRIVATE(userId, 'You have to join the channel first')
}
})
break;
这就是我的问题所在:
exports.flatroll = flatroll = function (userId, args) {
if (raidLoot.length === 0) {
send_MESSAGE_PRIVATE(userId, 'There is no loot')
return
}
connectdb().done(function (connection) {
checkAccess(userId).done(function (result) {
userAc = result
access_req(connection, 'rem').done(function (result) {
if (result[0].length === 0 || result[0].length > 0 && result[0][0].status === 'enabled') {
if (result[0].length === 0 || result[0][0].access_req <= userAc) {
getUserName(connection, userId).done(function (result) {
userName = result[0][0].name
if (!args) {
winnerList = '<center> <font color=#FFFF00> :::Flatroll Results::: </font> </center> \n'
for (loot in raidLoot) {
winnerList += '<font color=#00FFFF>Slot #' + (+loot + 1) + '</font> \n'
winnerList += 'Item: ' + raidLoot[loot] + '\n'
if (lootSlot[+loot + 1].length === 0) {
winnerList += 'Winner: No one added \n'
} else {
winnerList += 'Winner:</font><font color=#00FF00>' + _.sample(lootSlot[+loot + 1]) + '</font> \n'
lootSlot[+loot + 1] = []
raidLoot.splice(loot, 1) // This is the line I need a better alternative for.
}
winnerList += '<img src=tdb://id:GFX_GUI_FRIENDLIST_SPLITTER>\n'
}
send_PRIVGRP_MESSAGE(botId, blob('Winner List', winnerList))
connection.release()
} // else with args
})
} else {
connection.release()
send_MESSAGE_PRIVATE(userId, 'Access Denied')
}
} else {
connection.release()
send_MESSAGE_PRIVATE(userId, 'Command Disabled')
}
})
})
})
}
'raidLoot.splice(抢劫,1)'这确实有用,但结果不是我需要的,如果添加了多个项目并且用户只加入其中一个,那么显示的列表将包含所有项目除了最后一个,raidLoot的长度被修改,所以循环不会到达最后一个项目,依此类推多个项目,少得到显示。
我是node的新手,将这个项目作为一种学习方式,所以不要对我的新代码苛刻:)
答案 0 :(得分:0)
如果我将for循环拆分为2个单独的循环,1表示用于提取胜利者,第二个用于删除找到胜利者的数组,那么它似乎有效。
if (!args) {
winnerList = '<center> <font color=#FFFF00> :::Flatroll Results::: </font> </center> \n'
var rl = raidLoot
for (i = 0; i < rl.length; i++) {
winnerList += '<font color=#00FFFF>Slot #' + (i + 1) + '</font> \n'
winnerList += 'Item: ' + raidLoot[i] + '\n'
if (lootSlot[i + 1].length === 0) {
winnerList += 'Winner: No one added \n'
} else {
shuffleUsers = _.shuffle(lootSlot[i + 1])
console.log(shuffleUsers)
winnerList += 'Winner:</font><font color=#00FF00>' + _.sample(shuffleUsers) + '</font> \n'
}
winnerList += '<img src=tdb://id:GFX_GUI_FRIENDLIST_SPLITTER>\n'
}
send_PRIVGRP_MESSAGE(botId, blob('Winner List', winnerList))
for (i = 0; i < rl.length; i++) {
if (lootSlot[i + 1].length > 0) {
lootSlot[i + 1] = []
raidLoot = _.without(raidLoot, rl[i])
}
}
connection.release()
}