Javascript 如何使Array.indexOf()不区分大小写?
我正在为一个网站制作一段代码,该网站将有一个数组中的名称列表,并选择一个随机名称,我想添加一个功能,使用户可以从数组中添加或删除名称。我拥有所有这些功能,但在删除名称时,用户必须键入名称以匹配数组中的大小写。我试图使它不区分大小写,我做错了什么Javascript 如何使Array.indexOf()不区分大小写?,javascript,Javascript,我正在为一个网站制作一段代码,该网站将有一个数组中的名称列表,并选择一个随机名称,我想添加一个功能,使用户可以从数组中添加或删除名称。我拥有所有这些功能,但在删除名称时,用户必须键入名称以匹配数组中的大小写。我试图使它不区分大小写,我做错了什么 <html> <!--Other code uneeded for this question--> <p id="canidates"></p> <body> <input type="
<html>
<!--Other code uneeded for this question-->
<p id="canidates"></p>
<body>
<input type="text" id="delname" /><button onclick="delName()">Remove Name from List</button>
<script>
//Array of names
var names = [];
//Other code uneeded for this question
//List of Canidates
document.getElementById('canidates').innerHTML =
"<strong>List of Canidates:</strong> " + names.join(" | ");
//Other code uneeded for this question
//Remove name from Array
function delName() {
var dnameVal = document.getElementById('delname').value;
var pos = names.indexOf(dnameVal);
var namepos = names[pos]
var posstr = namepos.toUpperCase();
var dup = dnameVal.toUpperCase();
if(dup != posstr) {
alert("Not a valid name");
}
else {
names.splice(pos, 1);
document.getElementById('canidates').innerHTML =
"<strong>List of Canidates:</strong> " + names.join(" | ");
}
}
</script>
</body>
</html>
从列表中删除名称
//名称数组
变量名称=[];
//此问题不需要其他代码
//日期表
document.getElementById('canidates')。innerHTML=
“日期列表:”+名称。加入(“|”);
//此问题不需要其他代码
//从数组中删除名称
函数名(){
var dnameVal=document.getElementById('delname')。值;
var pos=名称.索引(dnameVal);
var namepos=名称[pos]
var posstr=namepos.toUpperCase();
var dup=dnameVal.toUpperCase();
如果(dup!=posstr){
警告(“无效名称”);
}
否则{
接头名称(位置1);
document.getElementById('canidates')。innerHTML=
“日期列表:”+名称。加入(“|”);
}
}
简单的方法是使用一个临时数组,其中包含所有大写名称。然后您可以比较用户输入。因此,您的代码可能会变成这样:
function delName() {
var dnameVal = document.getElementById('delname').value;
var upperCaseNames = names.map(function(value) {
return value.toUpperCase();
});
var pos = upperCaseNames.indexOf(dnameVal.toUpperCase());
if(pos === -1) {
alert("Not a valid name");
}
else {
names.splice(pos, 1);
document.getElementById('canidates').innerHTML =
"<strong>List of Canidates:</strong> " + names.join(" | ");
}
}
函数delName(){
var dnameVal=document.getElementById('delname')。值;
var upperCaseNames=names.map(函数(值){
返回值.toUpperCase();
});
var pos=upperCaseNames.indexOf(dnameVal.toUpperCase());
如果(位置==-1){
警告(“无效名称”);
}
否则{
接头名称(位置1);
document.getElementById('canidates')。innerHTML=
“日期列表:”+名称。加入(“|”);
}
}
希望这有助于解决您的问题。最好创建您自己的自定义
indexOf
方法,如下所示
“严格使用”;
var customIndexOf=函数(arrayLike,searchElement){
var object=对象(类似阵列);
var length=object.length>>>0;
var fromIndex=arguments.length>2?参数[2]>>0:0;
if(长度<1 | |搜索元素的类型!='string'| | fromIndex>=长度){
返回-1;
}
如果(从索引<0){
fromIndex=Math.max(长度-Math.abs(fromIndex),0);
}
var search=searchElement.toLowerCase();
对于(var index=fromIndex;index log(customIndexOf(name,'aNnE'))代码>在ECMA-262第5版中,您可以使用它
var array = [ 'I', 'hAve', 'theSe', 'ITEMs' ];
var query = 'these'.toLowerCase();
var index = -1;
array.some(function(element, i) {
if (query === element.toLowerCase()) {
index = i;
return true;
}
});
// Result: index = 2
你不能区分大小写。我将使用一个对象来保存一组名称:
function Names() {
this.names = {};
this.getKey = function(name) {
return name.toLowerCase();
}
this.add = function(name) {
this.names[this.getKey(name)] = name;
}
this.remove = function(name) {
var key = this.getKey(name);
if (key in this.names) {
delete this.names[key];
} else {
throw Error('Name does not exist');
}
}
this.toString = function() {
var names = [];
for (var key in this.names) {
names.push(this.names[key]);
}
return names.join(' | ');
}
}
var names = new Names();
function update() {
document.getElementById('canidates').innerHTML = '<strong>List of Canidates:</strong> ' + names;
}
function deleteName() {
var name = document.getElementById('delname').value;
try {
names.remove(name);
update();
} catch {
alert('Not a valid name');
}
}
update();
函数名(){
this.names={};
this.getKey=函数(名称){
返回name.toLowerCase();
}
this.add=函数(名称){
this.names[this.getKey(name)]=name;
}
this.remove=函数(名称){
var key=this.getKey(名称);
如果(输入此.names){
删除此项。名称[键];
}否则{
抛出错误('名称不存在');
}
}
this.toString=函数(){
变量名称=[];
for(此.names中的var键){
names.push(this.names[key]);
}
返回名称。联接(“|”);
}
}
变量名称=新名称();
函数更新(){
document.getElementById('canidates')。innerHTML='canidates列表:'+名称;
}
函数deleteName(){
var name=document.getElementById('delname')。值;
试一试{
姓名。删除(姓名);
更新();
}抓住{
警报(“不是有效名称”);
}
}
更新();
最优雅的解决方案是首先将数组转换为字符串,然后进行不区分大小写的比较。例如:
var needle = "PearS"
var haystack = ["Apple", "banNnas", "pEArs"];
var stricmp = haystack.toString().toLowerCase(); // returns
// "apple,bananas,pears"
if (stricmp.indexOf(needle.toLowerCase()) > -1) {
// the search term was found in the array
} else {
// the search term was not found in the array
}
ES2015:
var数组=['I','hAve','this','ITEMs'],
indexOf=(arr,q)=>arr.findIndex(item=>q.toLowerCase()==item.toLowerCase());
log(indexOf(数组,'i'))//0
log(indexOf(数组,'this'))//2
log(indexOf(数组,'items')//3
可以使用by-map方法。例如,请参见下面的代码
var _name = ['prasho','abraham','sam','anna']
var _list = [{name:'prasho'},{name:'Gorge'}];
for(var i=0;i<_list.length;i++)
{
if(_name.map(function (c) {
return c.toLowerCase();
}).indexOf(_list[i].name.toLowerCase()) != -1) {
//do what ever
}else{
//do what ever
}
}
var\u name=['prasho','abraham','sam','anna']
var_list=[{name:'prasho'},{name:'Gorge'}];
对于(var i=0;i将数组转换为由分隔符分隔的字符串,将该字符串转换为小写,然后使用相同的分隔符将该字符串拆分回数组:
函数findIt(arr、find、del){
如果(!del){del='.//.'}
arr=arr.join(del).toLowerCase().split(del);
返回arr.indexOf(find.toLowerCase());
}
var arr=[“汤姆·里德尔”、“罗恩·韦斯莱”、“哈利·波特”、“赫敏·格兰杰”];
var find=‘哈利波特’;
var指数=findIt(arr,find);
如果(~索引){
警报('Found'+arr[index]+'!:D');
}否则{
警报('未找到它。D:');
}
这是最短的
haystack.join(' ').toLowerCase().split(' ').indexOf(needle.toLowerCase())
我需要类似的东西,我需要使用includes
比较两个字符串,并且需要能够支持大小写和不区分大小写的搜索,所以我编写了以下小函数
function compare(l1: string, l2: string, ignoreCase = true): boolean {
return (ignoreCase ? l1.toLowerCase() : l1).includes((ignoreCase ? l2.toLowerCase() : l2));
}
同样的原则也适用于indexOf
,如下所示
function indexOf(l1: string, l2: string, ignoreCase = true): number {
return (ignoreCase ? l1.toLowerCase() : l1).indexOf((ignoreCase ? l2.toLowerCase() : l2));
}
我知道这不是特别的Array.indexOf
,但希望这能帮助那些在旅行中遇到这篇文章的人
不过,为了回答ops问题,您可以将其类似地应用于与this from组合的数组(对它的细微更改是在任何数组值包含空格的情况下使用tilda字符作为分隔符)
再次希望这有帮助。您可以使用
例如:
myArray = ['An', 'aRRay', 'oF', 'StringS'];
searchString = 'array';
found = myArray.find(key => key.toUpperCase() === searchString.toUpperCase()) != undefined;
if (found ) {
// The array contains the search string
}
else {
// Search string not found
}
注意:数组不能将未定义的作为值。不能将设为.ind
// unique only, removes latter occurrences
array.filter((v, i, a) => a.findIndex(j => v.toLowerCase() === j.toLowerCase()) === i);
myArray = ['An', 'aRRay', 'oF', 'StringS'];
searchString = 'array';
found = myArray.find(key => key.toUpperCase() === searchString.toUpperCase()) != undefined;
if (found ) {
// The array contains the search string
}
else {
// Search string not found
}
// unique only, removes latter occurrences
array.filter((v, i, a) => a.findIndex(j => v.toLowerCase() === j.toLowerCase()) === i);