Javascript刷題 》 查詢陣列元素位置

weixin_33827590發表於2016-12-04

找出元素 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

相關文章