常用jjs中数组元素搜索的方式
indexOf/lastIndexOf
indexOf()、lastIndexOf()方法返回数组中值的第一个索引,如果没有匹配项,则返回-1,语法如下:
/**
* @function 在数组中查找元素并返回匹配的下标
* @description 方法返回数组中值的第一个索引,如果没有匹配项,则返回-1
* @param searchElement {all} 需要查找的元素
* @param fromIndex{int} 可选,从该下标后开始查找。
* @return 返回数组中值的第一个索引,没有匹配项返回-1
*/
arr.indexOf(searchElement[, fromIndex])
例:
const arr=[1,3,"hot","jxmaker",{name:"jxmaker",role:"admin",id:"999"}];
const index1=arr.indexOf(3);//index1=1(数组中3所在位置下标从0开始)
const index2=arr.indexOf("hots");//index2=-1(找不到)
indexOf与lastIndexOf的区别在于查找方式不同,一个从头向后开始找,一个从尾开始向前找
includes
includes()返回数组中是否存在该元素,存在返回true,否则返回false,语法如下:
/**
* @function 判断数组中是否存在指定元素
* @description 判断数组中是否存在指定元素,存在返回true,不存在返回false
* @param valueToFind {all} 需要查找的值
* @param fromIndex {int} 可选,从该下标后开始查找。
* @return 存在返回true,不存在返回false
*/
arr.includes(valueToFind[, fromIndex])
例:
const arr=[1,3,"hot","jxmaker",{name:"jxmaker",role:"admin",id:"999"}];
const isExists1=arr.includes(3);//true
const isExists2=arr.includes("hots");//false(找不到)
find
find()方法返回通过测试(函数内判断)的数组的第一个元素的值,方法为数组中的每个元素都调用一次函数执行,语法如下:
/**
* @function 在数组中查找元素
* @description 返回通过测试(函数内判断)的数组的第一个元素的值,未找到返回undefind
* @param callback {function} 测试条件函数,当数组中的元素在测试条件时返回 true 时, 函数返回符合条件的元素,之后的值不会再调用执行函数。若为空数组,callback函数不会执行,函数执行过程不会改变原数组的值
* @param thisValue {object} 可选。 传递给函数的值一般用 "this" 值,如果这个参数为空、 "undefined" 会传递给 "this" 值。
* @return 方法返回通过测试(函数内判断)的数组的第一个元素的值,未找到返回undefind
*/
arr.find(callback(element[, index[, array]])[, thisValue])
例:
const arr=[1,3,"hot","jxmaker",{name:"jxmaker",role:"admin",id:"999"}];
const obj1=arr.find(ele=>ele?.id==="999");//{name:"jxmaker",role:"admin",id:"999"}
const obj2=arr.find(ele=>ele==="3");//undefined(找不到,数组中的3为数字型,此处函数判断的为字符串类型3)
filter()
filter()方法返回新数组,新数组包含所有与函数条件匹配的值。如果没有匹配项,则返回空数组,语法如下:
/**
* @function 在数组中查找元素,返回新数组包含所有匹配的元素
* @description 在数组中查找元素,返回新数组包含所有匹配的元素
* @param callback {function} 测试条件函数,当数组中的元素在测试条件时返回 true 时为测试通过
* @param thisValue {object} 可选。 传递给函数的值一般用 "this" 值,如果这个参数为空、 "undefined" 会传递给 "this" 值。
* @return {args} 返回包含所有匹配元素的新数组
*/
arr.filter(callback(element[, index[, array]])[, thisValue])
例:
const arr=[1,3,"hot","jxmaker",{name:"jxmaker",role:"admin",id:"999"}];
const arrFind1=arr.find(ele=>ele?.id==="999" || ele===3);//[{name:"jxmaker",role:"admin",id:"999"},3]
const obj2=arr.find(ele=>ele==="33");//[](找不到,返回空数组)
filter有许多巧妙的用法,具体可以看廖雪峰的博客中的例子
使用linq.js中的where查找
我是.net起家的开发者,所以对linq有特殊的偏爱,经常使用以下方法
const arr=[1,3,"hot","jxmaker",{name:"jxmaker",role:"admin",id:"999"}];
Enumerable.from(arr)
.where("ele=>ele!=null && ele.name=='999'")//匹配条件,可用字符串也可用callback函数
.orderBy(function (ele) { return ele.id; })//排序方式,可用字符串也可用callback函数
.toArray()//返回新数组包含匹配项,如果只要返回一条用single()、singleOrDefault(),匹配结果超过一条会报错,用first()、firstOrDefault()返回第一条,有多条匹配结果不会报错
.forEach(function (ele) {
document.write(ele.name+ "[" + ele.role+ "]" "<br/>");
});
使用此方法需要先引入linq.js文件
linq.js用于快捷进行花式查找、统计,提高编码速度,推荐使用。
注:网上很多linq.js的教程函数都已大写开头,不知是我使用版本问题还是其它原因(包括使用npm安装的版本),经测试,Enumerable对象中所有函数遵循驼峰命名法(小写字母开头)
更多linq.js使用方法:
https://www.cnblogs.com/sword-successful/archive/2014/11/25/4120946.html