如何使Array.indexOf()不区分大小写?

Mal*_*olm 65 javascript

我正在为一个网站制作一段代码,该网站将在数组中包含一个名称列表,并选择一个随机名称,我想添加一个功能,让用户在数组中添加或删除一个名称.我拥有所有这些功能,但在删除名称时,用户必须键入名称以匹配数组中的Case.我试图这样做就是Case-Insensitive,我做错了什么?

<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>
Run Code Online (Sandbox Code Playgroud)

vsy*_*ync 50

ES2015 findIndex:

var array = ['I', 'hAve', 'theSe', 'ITEMs'],
    query = 'these',
    result = array.findIndex(item => query.toLowerCase() === item.toLowerCase());

console.log(result); // 2
Run Code Online (Sandbox Code Playgroud)

  • Internet Explorer不支持. (8认同)
  • @VSetyawan 谁在乎?那个浏览器应该早就消失了! (2认同)
  • @VSetyawan 哈哈,那是什么 ́\_(ツ)_/̊ (2认同)

qui*_*int 27

在ECMA-262第5版中,您可以使用Array.prototype.some它.

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
Run Code Online (Sandbox Code Playgroud)

  • @sxnine同样,你实际上会使用`String(element).toLowerCase()`以防`element`不能保证是一个字符串......我假设`query`已经是小写的.我编辑了帖子,将其添加到循环外部以进行演示.它不属于循环内部,因为它会在每次迭代时发生. (3认同)

Ral*_*lph 23

简单的方法是拥有一个包含所有大写名称的临时数组.然后您可以比较用户输入.所以你的代码可能变成这样的东西:

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(" | ");
        }
    }
Run Code Online (Sandbox Code Playgroud)

希望这有助于解决您的问题.

  • 每个人都用他们的自定义indexOf实现严重过度思考...虽然我喜欢user113215回答使用**Array.prototype.some**... (2认同)

DMC*_*ing 6

最优雅的解决方案是首先将数组转换为字符串,然后进行不区分大小写的比较.例如:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 我希望`needle`永远不会包含逗号. (4认同)

Xot*_*750 5

可能最好创建自己的自定义indexOf方法,就像这样.

'use strict';

var customIndexOf = function(arrayLike, searchElement) {
  var object = Object(arrayLike);
  var length = object.length >>> 0;
  var fromIndex = arguments.length > 2 ? arguments[2] >> 0 : 0;
  if (length < 1 || typeof searchElement !== 'string' || fromIndex >= length) {
    return -1;
  }

  if (fromIndex < 0) {
    fromIndex = Math.max(length - Math.abs(fromIndex), 0);
  }

  var search = searchElement.toLowerCase();
  for (var index = fromIndex; index < length; index += 1) {
    if (index in object) {
      var item = object[index];
      if (typeof item === 'string' && search === item.toLowerCase()) {
        return index;
      }
    }
  }

  return -1;
};

var names = [
  'John',
  'Anne',
  'Brian'
];

console.log(customIndexOf(names, 'aNnE'));
Run Code Online (Sandbox Code Playgroud)

甚至

'use strict';

var customIndexOf = function(array, searchElement, fromIndex) {
  return array.map(function(value) {
    return value.toLowerCase();
  }).indexOf(searchElement.toLowerCase(), fromIndex);
};

var names = [
  'John',
  'Anne',
  'Brian'
];

console.log(customIndexOf(names, 'aNnE'));
Run Code Online (Sandbox Code Playgroud)

您可能还想添加更多检查以确保数组中的每个元素实际上都是a,String并且searchElement实际上也是一个String.如果在ES5之前,则加载适当的垫片