實(shí)際開(kāi)發(fā)當(dāng)中,我們經(jīng)常會(huì)遇到類似諸如下面的需求:
在本文中,我們將討論四種可用于搜索數(shù)組中項(xiàng)目的方法。這些方法是:
接下來(lái),我們就一起來(lái)看一下這四種方式
我們可以使用 Array.filter() 方法在數(shù)組中查找滿足特定條件的元素。
例如,如果我們要獲取大于10的數(shù)字?jǐn)?shù)組中的所有項(xiàng)目,則可以執(zhí)行以下操作:
const array = [10, 11, 3, 20, 5];
const greaterThanTen = array.filter(element => element > 10);
console.log(greaterThanTen) //[11, 20]
使用 array.filter() 方法的語(yǔ)法如下:
let newArray = array.filter(callback);
著這里:
如果數(shù)組中沒(méi)有項(xiàng)目符合條件,則返回一個(gè)空數(shù)組。
有時(shí),我們不需要滿足特定條件的所有元素。我們只需要一個(gè)符合條件的元素。在這種情況下,需要使用find()方法。
使用 Array.find()方法查找滿足特定條件的第一個(gè)元素。就像 filter 方法一樣,它以回調(diào)為參數(shù),并返回滿足回調(diào)條件的第一個(gè)元素。
我們嘗試一下在上面的示例中對(duì)數(shù)組使用 find 方法。
const array = [10, 11, 3, 20, 5];
const greaterThanTen = array.find(element => element > 10);
console.log(greaterThanTen)//11
array.find() 的語(yǔ)法為
let element = array.find(callback);
callback 是在數(shù)組中的每個(gè)值上執(zhí)行的函數(shù),帶有三個(gè)參數(shù):
但是請(qǐng)注意,如果數(shù)組中沒(méi)有項(xiàng)目符合條件,則返回 undefined。
但是,如果想檢查某個(gè)元素是否在數(shù)組中怎么辦?
includes() 方法確定數(shù)組是否包含某個(gè)值,并在適當(dāng)時(shí)返回 true 或 false。
因此,在上面的示例中,如果我們要檢查20是否為數(shù)組中的元素之一,則可以執(zhí)行以下操作:
const array = [10, 11, 3, 20, 5];
const includesTwenty = array.includes(20);
console.log(includesTwenty)//true
你會(huì)注意到此方法與其他方法之間的區(qū)別。此方法接受值而不是回調(diào)作為參數(shù)。這是 include 方法的語(yǔ)法:
const includesValue = array.includes(valueToFind, fromIndex)
要了解索引的概念,讓我們?cè)俅问褂蒙厦娴氖纠?/p>
如果要檢查數(shù)組是否在第一個(gè)元素之外的其他位置包含10個(gè),可以執(zhí)行如下操作:
const array = [10, 11, 3, 20, 5];
const includesTenTwice = array.includes(10, 1);
console.log(includesTenTwice)//false
indexOf() 方法返回可以在數(shù)組中找到給定元素的第一個(gè)索引。如果數(shù)組中不存在該元素,則返回 -1。
回到例子。讓我們找到數(shù)組中 3 的索引。
const array = [10, 11, 3, 20, 5];
const indexOfThree = array.indexOf(3);
console.log(indexOfThree)//2
其語(yǔ)法類似于該 includes 方法的語(yǔ)法。
const indexOfElement = array.indexOf(element, fromIndex)
請(qǐng)務(wù)必注意,includes 和 indexOf 方法都使用嚴(yán)格的相等性('===')搜索數(shù)組。如果值的類型不同(例如4和'4'),它們將分別返回 false 和 -1。
使用這些數(shù)組方法,無(wú)需使用 for 循環(huán)即可搜索數(shù)組。根據(jù)您的需求,您可以決定哪種方法最適合您的用例。
以下是何時(shí)使用每種方法的摘要:
我們?cè)谌粘i_(kāi)發(fā)中,常常有判斷某值的需求,今天我們總結(jié)一下常見(jiàn)的幾種用來(lái)判斷是否為數(shù)組的 JavaScript 方法。
Array.isArray() 是ES5新增的方法,用于確定傳遞的值是否是一個(gè)數(shù)組,如果是數(shù)組,則返回 true,否則返回 false。
let arr = [];
console.log(Array.isArray(arr)); // true
下面的函數(shù)調(diào)用都返回 true:
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
Array.isArray(new Array("a", "b", "c", "d"));
需要注意的一點(diǎn)是:其實(shí) Array.prototype 也是一個(gè)數(shù)組。
Array.isArray(Array.prototype); // true
下面的函數(shù)調(diào)用都返回 false:
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray(new Uint8Array(32))
Array.isArray({ __proto__: Array.prototype });
兼容性如下圖:
可以看到,新版的主流瀏覽器都是支持該方法的,可以放心使用。
Object 的每個(gè)實(shí)例都有構(gòu)造函數(shù) constructor,用于保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)
let arr = [];
console.log(arr.constructor === Array); // true
需要注意的是,constructor 有被修改的風(fēng)險(xiǎn),判斷結(jié)果不一定準(zhǔn)確,比如:
let arr = [1, 2, 3];
arr.constructor = function () { }
console.log(arr.constructor === Array); // false
一般不推薦使用 constructor 來(lái)判斷是否為數(shù)組,我們只需要知道有這么一個(gè)方法就行。
instanceof 運(yùn)算符用于檢測(cè)構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上。舉個(gè)例子:
// 定義構(gòu)造函數(shù)
function C() {}
function D() {}
var o = new C();
o instanceof C; // true,因?yàn)?Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false,因?yàn)?D.prototype 不在 o 的原型鏈上
o instanceof Object; // true,因?yàn)?Object.prototype.isPrototypeOf(o) 返回 true
C.prototype instanceof Object; // true,同上
用 instanceof 來(lái)判斷是否為數(shù)組的用法如下:
let arr = [];
console.log(arr instanceof Array); // true
使用 instanceof 需要注意兩點(diǎn):
isPrototypeOf() 可以用于測(cè)試一個(gè)對(duì)象是否存在于另一個(gè)對(duì)象的原型鏈上。用法如下:
function Foo() {}
function Bar() {}
function Baz() {}
Bar.prototype = Object.create(Foo.prototype);
Baz.prototype = Object.create(Bar.prototype);
var baz = new Baz();
console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Foo.prototype.isPrototypeOf(baz)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true
如果要用 isPrototypeOf 來(lái)判斷傳入?yún)?shù)是否為數(shù)組,可以這樣用:
let arr = [];
console.log(Array.prototype.isPrototypeOf(arr)); // true
每個(gè)對(duì)象都有一個(gè) toString() 方法,當(dāng)該對(duì)象被表示為一個(gè)文本值時(shí),或者一個(gè)對(duì)象以預(yù)期的字符串方式引用時(shí)自動(dòng)調(diào)用。
默認(rèn)情況下,toString() 方法被每個(gè) Object 對(duì)象繼承。如果此方法在自定義對(duì)象中未被覆蓋,toString() 返回 "[object type]" 字符串,其中 type 是對(duì)象的類型。
可以通過(guò) toString() 來(lái)獲取每個(gè)對(duì)象的類型。為了每個(gè)對(duì)象都能通過(guò) Object.prototype.toString() 來(lái)檢測(cè),需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式來(lái)調(diào)用,傳遞要檢查的對(duì)象作為第一個(gè)參數(shù),稱為 thisArg。用法如下:
var toString = Object.prototype.toString;
toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]
//Since JavaScript 1.8.5
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
如果要用來(lái)判斷一個(gè)對(duì)象是否為數(shù)組,可這樣使用:
let arr = [];
console.log(Object.prototype.toString.call(arr) === "[object Array]"); // true
兼容性如下:
說(shuō)到判斷類型,可能很多人都會(huì)想到 typeof 方法,我們這里來(lái)復(fù)習(xí)一下 typeof 相關(guān)內(nèi)容。
typeof 操作符返回一個(gè)字符串,表示未經(jīng)計(jì)算的操作數(shù)的類型。
console.log(typeof 42); // "number"
console.log(typeof 'blubber'); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undeclaredVariable); // "undefined"
typeof 可能的返回值如下:
通過(guò)上圖可以看到,數(shù)組對(duì)象屬于“其他任何對(duì)象”,所以數(shù)組對(duì)象的 typeof 返回值是 “object”:
let arr = [];
console.log(typeof arr); // "object"
所以,我們要盡量避免使用 typeof。
以上就是幾種用來(lái)判斷一個(gè)值是否為數(shù)組的幾種方法,當(dāng)然有好用的也有不好用的,但是不管怎樣,我們知道有這么回事總歸是好的。總結(jié)一下:
~
~本文完,感謝閱讀!
~
學(xué)習(xí)有趣的知識(shí),結(jié)識(shí)有趣的朋友,塑造有趣的靈魂!
大家好,我是〖編程三昧〗的作者 隱逸王,我的公眾號(hào)是『編程三昧』,歡迎關(guān)注,希望大家多多指教!
你來(lái),懷揣期望,我有墨香相迎! 你歸,無(wú)論得失,唯以余韻相贈(zèng)!
知識(shí)與技能并重,內(nèi)力和外功兼修,理論和實(shí)踐兩手都要抓、兩手都要硬!
avaScript 提供了一系列強(qiáng)大的數(shù)組方法,這些方法可以極大地簡(jiǎn)化數(shù)組的操作和處理。理解并掌握這些方法對(duì)任何JavaScript開(kāi)發(fā)者來(lái)說(shuō)都是至關(guān)重要的。
數(shù)組方法可以分為幾類,包括添加和移除元素的方法、遍歷和變換的方法、查找和篩選的方法,以及其他雜項(xiàng)方法。添加和移除元素的方法如 .push() 和 .unshift(),分別用于在數(shù)組末尾和開(kāi)頭添加元素,而 .pop() 和 .shift() 則用于移除數(shù)組末尾和開(kāi)頭的元素。這些方法修改了原數(shù)組的長(zhǎng)度,并返回被移除的元素。
遍歷和變換的方法如 .map() 和 .filter() 允許開(kāi)發(fā)者對(duì)數(shù)組中的每個(gè)元素進(jìn)行操作,并返回一個(gè)新的數(shù)組。.map() 方法對(duì)數(shù)組中的每個(gè)元素執(zhí)行給定的函數(shù),并返回包含結(jié)果的新數(shù)組,而 .filter() 則返回一個(gè)新的數(shù)組,包含所有通過(guò)指定函數(shù)測(cè)試的元素。
查找和篩選的方法如 .includes() 和 .find() 提供了在數(shù)組中查找特定元素的能力。.includes() 檢查數(shù)組是否包含某個(gè)元素,并返回一個(gè)布爾值。.find() 返回?cái)?shù)組中滿足提供的測(cè)試函數(shù)的第一個(gè)元素的值,或者在沒(méi)有滿足測(cè)試函數(shù)的元素時(shí)返回 undefined。
其他重要的數(shù)組方法還包括 .reverse()、.slice() 和 .splice()。.reverse() 顛倒數(shù)組中元素的順序。.slice() 返回一個(gè)新的數(shù)組對(duì)象,這一對(duì)象是原數(shù)組的一個(gè)淺拷貝,由開(kāi)始索引到結(jié)束索引(不包括結(jié)束索引)選擇的部分組成。.splice() 方法則可以添加或移除數(shù)組中的元素,并返回被移除的元素。
js中數(shù)組方法
總的來(lái)說(shuō),這些方法不僅可以極大地提高代碼的可讀性和維護(hù)性,還能使數(shù)組操作更加高效和簡(jiǎn)潔。無(wú)論是進(jìn)行簡(jiǎn)單的元素添加和移除,還是復(fù)雜的數(shù)據(jù)轉(zhuǎn)換和篩選,JavaScript 的數(shù)組方法都能提供強(qiáng)有力的支持。掌握這些方法將有助于開(kāi)發(fā)者在編寫(xiě)代碼時(shí)更加得心應(yīng)手,處理數(shù)組相關(guān)的任務(wù)也會(huì)變得更加輕松。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。