- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
GOOGLE SCRIPT 不仅仅是普通的 javascript。
我正在尝试整理一张谷歌表格来显示在线视频游戏的排名,Cube 2, Sauerbraten .我已经有办法在任何给定时刻获取服务器上的玩家列表。然而,由于总是有人加入和离开军团,如果当一个人离开和/或加入一个新军团时,他必须重新开始排名,那将是非常令人失望的。所以我很快想出了下面的代码,希望扫描一个玩家的名字,如果名字开头有一个氏族标签,它就会去掉它。 clansPre 是一些氏族标签的数组。这个想法是,如果 va|P1、RED|P2、.rC|P3、!s]P4、[RUSS]P5、Crowd>P6、oo|P7 和 P08 一起玩游戏,他们的统计数据将记录在 P1 下、P2、P3、P4、P5、P6、P7 和 P08。然而,我能做的有限测试表明它总是删除前 3 个字符,无论名称如何。此外,当我尝试使用 startWith() 时,cName 是我尝试以字符串形式获取名称的尝试。
var clansPre = ["va|", "RED|", ".rC|", "!s]", "vaQ'", "[RUSS]", "cm|", "Crowd>", "oo|"];
var numClans = clansPre.length;
function nameWoClan(name){
var cName = name.substring(0, name.length)
for(var cC = 0; cC<numClans; cC++) {
if(cName.search(clansPre[cC]) == 0) {
return cName.substring(clansPre[cC].length, name.length)
}
}
return cName;
}
这可能是我完全愚蠢,但在辩护中,我唯一没有自学的编程语言是 Java,那是去年的,从那以后我真的不需要使用 Java ,所以我有点生疏了。无论如何,谢谢你!
最佳答案
您的尝试方向正确。
但是根据您的代码。
var cName = name.substring(0, name.length)
似乎是多余的。
你说你想要订阅 name
从 0
的起始索引开始至 name.length
这与
var cName = name;
现在我写了一个更复杂的例子来确定氏族名字是否是名字的一部分。如果是,则删除氏族名称,但也会返回具有氏族名称的对象。现在此方法不区分大小写(因为它降低了文本)。因此,如果您想要区分大小写的匹配,请删除这两个调用 toLowerCase()
function nameWoClan(name) {
if (!name)
return null;
var clanName = '';
for (var i = 0; i < clansPre.length; i++) {
if (name.toLowerCase().startsWith(clansPre[i].toLowerCase())) {
clanName = name.substring(0, clansPre[i].length);
name = name.substring(clansPre[i].length);
break;
}
}
return {
clanName: clanName,
playerName: name
}
}
下面我做了一个简单的例子。
$('#extract-name').on('click', function() {
var names = $('#player-names').val().split('\n');
$('#names-list-body').html(''); //clear the table
names.forEach(function(item, index) {
var name = nameWoClan(item);
if (name) {
$('#names-list-body').append($('<tr><td>' + item + '</td><td>' + name.clanName + '</td><td>' + name.playerName + '</td></tr>'));
}
});
});
var clansPre = ["va|", "RED|", ".rC|", "!s]", "vaQ'", "[RUSS]", "cm|", "Crowd>", "oo|"];
function nameWoClan(name) {
if (!name)
return null;
var clanName = '';
for (var i = 0; i < clansPre.length; i++) {
if (name.toLowerCase().startsWith(clansPre[i].toLowerCase())) {
clanName = name.substring(0, clansPre[i].length);
name = name.substring(clansPre[i].length);
break;
}
}
return {
clanName: clanName,
playerName: name
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>
One full name per line
</p>
<textarea id="player-names" rows="5" cols="65">
john
.rC|sally
[RUSS]Superman
oo|Batman
RED|MAN
RED|va|
</textarea>
<br/>
<button type="button" id="extract-name">
Extract Name
</button>
<table id="names-list">
<thead>
<tr>
<th>Original Name</th>
<th>Clan Name</th>
<th>Player Name</th>
</tr>
</thead>
<tbody id="names-list-body"></tbody>
</table>
审核后编辑
在查看 Google 电子表格脚本(以前从未见过)之后。发现我们需要一些额外的位。第一个startsWith
似乎不被支持。不知道为什么。所以我写了一个简单的 starts with 函数。
function myStartsWith(name, clanName){
name = name.toLowerCase();
clanName = clanName.toLowerCase();
var cNameLen = clanName.length;
var nameLen = name.length;
return cNameLen < nameLen && name.substring(0, cNameLen) === clanName;
}
现在我创建了一个示例副本 Copy of Pasta Ranks并更新了脚本。
function myStartsWith(name, clanName){
name = name.toLowerCase();
clanName = clanName.toLowerCase();
var cNameLen = clanName.length;
var nameLen = name.length;
return cNameLen < nameLen && name.substring(0, cNameLen) === clanName;
}
function nameWoClan(name) {
if (!name)
return null;
var clanName = '';
for (var i = 0; i < clansPre.length; i++) {
var match = myStartsWith(name, clansPre[i]);
if (match) {
clanName = name.substring(0, clansPre[i].length);
name = name.substring(clansPre[i].length);
break;
}
}
return {
clanName: clanName,
playerName: name
}
}
function testing(){
//get the sheet to query
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[2];
//get the last row index
var lastRow = sheet.getLastRow();
//get the player names range O2:O18 //removes header
var range = sheet.getRange(2, 15, lastRow);
//get the values for the range
var data = range.getValues()
var names = [];
//iterate the range getting the records. note index [0] as values is a multi-dimension name
for(var i = 0;i< lastRow;i++){
var name = nameWoClan(data[i][0]);
if(name)
{
names.push(name);
}
}
var n = names;
}
它不是漂亮但如果你调试 testing
函数并在最后一个 var n = names
上设置断点你会看到names
包含玩家名称和氏族名称的列表。
还值得注意的是,所有玩家名称实际上都没有氏族名称,因此我添加了 evil.
作为测试用例。
关于javascript - 从可能有或没有氏族标签前缀的名字中获取真实姓名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42079601/
我是一名优秀的程序员,十分优秀!