標籤:javascript伺服器端進階編程(array.indexof()和lastindexof()方法)
文法格式:
array.indexOf(searchElement[, fromIndex]);
array.lastIndexOf(searchElement[, fromIndex]);
功能:返回某個指定的元素值在數組中首次出現的位置。該方法將從頭到尾地檢索數組,看它是否含有元素searchElement。開始檢索的位置在數組的fromIndex處或數組的開頭(沒有指定fromIndex時)。如果找到一個相匹配的元素,則返回此元素的第一次出現的位置。如果沒有找到,則返回-1。
注意:lastIndexOf方法從數組結束處由後往前搜尋。
對於indexOf方法fromIndex的值應當為大於或者等於0的整數;如果為負整數,則返回-1。
對於lastIndexOf方法fromIndex的值也可能為負整數。當為負整數時,表達從結尾的第|fromIndex|個元素開始往前搜尋。
舉例:
var index = [12, 5, 8, 130, 44].indexOf(8); //預設從索引0開始搜尋,結果index=>2[12, 5, 8, 130, 44].indexOf(130,1); //從索引值1處搜尋,輸出3[12, 5, 8, 130, 44].indexOf(130,-1); //輸出-1["Hello"," Hello","Hello "," Hello ","hello"].lastIndexOf(‘hello‘,-1); //輸出4["Hello"," Hello","Hello "," Hello ","hello"].lastIndexOf(‘hello‘,0); //輸出-1["Hello"," Hello","Hello "," Hello ","hello"].lastIndexOf(‘ Hello ‘,-2); //輸出3
indexOf和lastIndexOf方法使用全等(===)來判斷一個元素是否存在於數組中。搜尋字串及數字可能沒有問題,但是搜尋對象和數組可能會有問題。如下的代碼片斷便給出有力證明:
var arr = [ {"name": "Zhang","blog": "http://www.zhang.com"}, {"name": "John","blog": "http://www.john.com"}, {"name":"李四","blog":"http://www.lisi.com"}];var index=arr.indexOf({"name": "Zhang","blog": "http://www.zhang.com"});console.log("index: ",index); //輸出:index: -1var o1={"name": "Zhang","blog": "http://www.zhang.com"}, o2={"name":"李四","blog":"http://www.lisi.com"};var arr_2=[o1,o2];var index_2= arr_2.indexOf(o2);console.log("index_2: ",index_2); //輸出:index: 1 //Ex3var arr_3=[[1,2,3],[‘one‘,‘two‘,‘three‘]];var a1=[1,2,3];var a2=[‘one‘,‘two‘,‘three‘];var index_3=arr_3.indexOf(a1);console.log("index_3: ",index_3); //輸出:index: -1 var arr_4=[a1,a2];var index_4=arr_4.indexOf(a1);console.log("index_4: ",index_4); //輸出:index_4: 0
上面的第1個例子輸出結果為-1,為什嗎?其實問題在於判斷兩個對象是否相等的問題。在JS開發中,判斷兩個對象是否相等時,只有兩個對象指向相同的地址,這兩個對象才是相等的;有時,可能存在兩個對象的屬性和值都相等,但是這兩個對象仍然不相等。對於兩個數組(也是對象)判斷相等,原理同樣。
工具 + 生產力函數findAll
下面給出一個簡單的工具 + 生產力函數findAll,基於indexOf,用於找出數組中匹配的所有元素所在下標。此函數返回所有下標組成的數組。
function findAll(arr,value){ var results=[],len=arr.length,pos=0; while(pos<len){ pos=arr.indexOf(value,pos); if(pos===-1) break; results.push(pos); pos++; } return results;}var indice=findAll([,1,2,3,4,5,6,3,,5,7,89,3,2,3],3);console.log(‘indice: ‘,indice);//結果:indice: [ 3, 7, 12, 14 ]通用解決方案(適合ECMAScript3和ECMAScript5)
Array.prototype.indexOf = Array.prototype.indexOf || function (value, start) { if (start && typeof start !== ‘number‘) { throw TypeError(start + ‘ is not a number‘); } var start = start || 0, len = this.length; if (start > 0) { start = Math.floor(start); } else if (start < 0) { start = Math.ceil(start) + len; } for (var i = start; i < len; i++) { if (this[i] === value) { return i; } } return -1; }; Array.prototype.lastIndexOf = Array.prototype.lastIndexOf || function (value, start) { if (start && typeof start !== ‘number‘) { throw TypeError(start + ‘ is not a number‘); } var len = this.length, start = start || len - 1; if (start > 0) { start = Math.floor(start); } else if (start < 0) { start = Math.ceil(start) + len; } for (var i = start; i >= 0; i--) { if (this[i] === value) { return i; } } return -1; };
本文出自 “青峰” 部落格,請務必保留此出處http://zhuxianzhong.blog.51cto.com/157061/1651751
JavaScript伺服器端進階編程(Array.indexOf()和lastIndexOf()方法)