找出元素 item 在給定陣列 arr 中的位置
輸出描述:
function indexOf(arr, item) {
.....
}
如果陣列中存在 item,則返回元素在陣列中的位置,否則返回 -1
輸入例子:
indexOf([ 1, 2, 3, 4 ], 3)
輸出例子:
2
實現方法
1、先將arr轉換成字串,然後使用字串的indexOf
function indexOf(arr, item) {
return arr.join("").indexOf(item);
}
2、直接使用陣列的indexOf
function indexOf(arr, item) {
return arr.indexOf(item);
}
3、使用for迴圈
function indexOf(arr, item) {
for(let [i,x] of arr.entries()){
if(x===item)return i;
}
return -1;
}
判斷當前項是否等於傳進來的那一項,如果到最後一項都沒有找到,則返回-1
4、使用findIndex方法
function indexOf(arr, item) {
return arr.findIndex(value=>value===item);
}
5、將傳進來的值當做陣列分割符
function indexOf(arr, item) {
var newArr = ("," + arr.toString() + ",").split("," + item + ",");
if(newArr.length<=1){
return -1;
}
var index = newArr[0].split(",").length-1;
return index;
}
這個方法雖然複雜了點,但很有趣,會用前面的幾個方法頂多算是對api還算了解,但這個更多的是靠程式設計能力。
其實一開始比較簡單的,沒有這麼複雜,但有個小bug,所有到後面就變的複雜了些,講一下這題的原理。
如果我們將傳進來的值當成一個分割符會是什麼效果?
1、先將這個陣列轉換成字串
[1, 2, 3].toString(); //1,2,3
2、用傳進來的那個值當作字串分割符,切成陣列
function indexOf(arr, item) {
return arr.toString().split(item);
}
console.log(indexOf([1, 2, 3],2)) //["1,", ",3"]
會被切成兩份,而["1,",]的第二位就是我們需要的索引,因此
arr.toString().split(item)[0] //1,
我們再將這個1, 轉換成陣列,其中的陣列長度-1就是我們要的索引。
arr.toString().split(item)[0].split(",").length-1
雖然看似完成了,但還有一些bug得解決,如果沒有找到呢?
3、解決如果找不到
怎麼知道找不到呢?如果說當前的這個值用做分割後,這個陣列的長度和之前的一樣長,或者長度為1,那不就是找不到嗎,那我們可以這樣
function indexOf(arr, item) {
var newArr = arr.toString().split(item); //如果長度為1說明陣列沒有被分割掉值
if(newArr.length<=1)return -1;
return newArr[0].split(",").length-1;
}
console.log(indexOf([1, 2, 3],5)) //-1
以及完成了一部分了,但還有個bug,一開始沒有考慮到的,比如這個陣列是一個多位,而查詢的值為單個,那麼肯定就會出現問題的,如下
console.log(indexOf([12, 2, 3],1)) //0
導致這個結果的問題是,[12,2,3]轉換成字串後是12,2,3將1當作分割符自然能找到12裡面的那個1,解決這個問題,就得動點腦了,首先我們需要解決的問題是,防止12被當作1來查詢。我們可以在當前這個值前後新增一個值,如下
如查詢
12,2,3
我們可以這樣
,12,2,3,
也就是說把12給包圍住,查詢的時候,我們將當前的這個值前後也加上","那麼它們就是一個整體了。
因此最後就成了如下的這段程式碼
function indexOf(arr, item) {
var newArr = ("," + arr.toString() + ",").split("," + item + ",");
if(newArr.length<=1){
return -1;
}
var index = newArr[0].split(",").length-1;
return index;
}
console.log(indexOf([122, 2, 3],12)) //-1