簡體   English   中英

如何使 Array.indexOf() 不區分大小寫?

[英]How do I make Array.indexOf() 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>

ES2015 查找索引

 var array = ['I', 'hAve', 'theSe', 'ITEMs'], indexOf = (arr, q) => arr.findIndex(item => q.toLowerCase() === item.toLowerCase()); console.log( indexOf(array, 'i') ) // 0 console.log( indexOf(array, 'these') ) // 2 console.log( indexOf(array, 'items') ) // 3

在 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

簡單的方法是擁有一個包含所有大寫名稱的臨時數組。 然后您可以比較用戶輸入。 所以你的代碼可能會變成這樣:

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(" | ");
        }
    }

希望這有助於解決您的問題。

最優雅的解決方案是先將數組轉換為字符串,然后進行不區分大小寫的比較。 例如:

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
}

可能最好創建自己的自定義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'));

甚至

 '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'));

您可能還想添加更多檢查以確保數組中的每個元素實際上都是一個String ,並且searchElement實際上也是一個String 如果是 ES5 之前的,則加載適當的墊片

您可以使用Array.prototype.find()

found = myArray.find(key => key.toUpperCase() === searchString.toUpperCase()) != undefined;

例子:

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
}

注意:數組不能包含undefined作為值。

可以通過 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
   }
}

更多信息

我需要類似的東西,我需要使用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 問題,您可以將其類似地應用於與@ULIT JAIDEE 的答案相結合的數組(對此的細微更改是使用 tilda 字符作為分隔符,以防任何數組值包含空格)

function compare(l1: any[], l2: any[], ignoreCase = true): boolean {
  return (ignoreCase ? l1.join('~').toLowerCase().split('~') : l1).indexOf((ignoreCase ? l2.join('~').toLowerCase().split('~') : l2));
}

再次希望這會有所幫助。

將數組轉換為由分隔符分隔的字符串,將該字符串變為小寫,然后將字符串拆分回由相同分隔符分隔的數組:

 function findIt(arr, find, del) { if (!del) { del = '_//_'; } arr = arr.join(del).toLowerCase().split(del); return arr.indexOf(find.toLowerCase()); } var arr = ['Tom Riddle', 'Ron Weasley', 'Harry Potter', 'Hermione Granger']; var find = 'HaRrY PoTtEr'; var index = findIt(arr, find); if (~index) { alert('Found ' + arr[index] + '! :D'); } else { alert('Did not find it. D:'); }

這是最短的。

haystack.join(' ').toLowerCase().split(' ').indexOf(needle.toLowerCase())
// unique only, removes latter occurrences    
array.filter((v, i, a) => a.findIndex(j => v.toLowerCase() === j.toLowerCase()) === i);

你不能讓它不區分大小寫。 我會使用一個對象來保存一組名稱:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM