目錄
- 了解數組
- 數組的方法
-
- arr.splice()
- arr.sort()
- arr.forEach()
- arr.reduce()
- arr.map()
-
- forEach()和map()的差別
- 判斷數組内是否有某值
-
- array.indexOf(searchElement)
- array.includes(searchElement[, fromIndex])
- 多元數組
-
- 統一初始值的二維數組
- 合并已知數組建立多元數組
- 僞數組
-
- 筆試題(拼多多)
- 算法題
-
- leetcode (easy) 724. 尋找數組的中心索引
-
- 解題思路
- 文法筆記
-
- 1. 數組方法:數組求和 arr.forEach() / arr.reduce()
- 2. 數組方法:對數組内每一項進行操作 arr.map()
- leetcode 66. 加一 (easy)
-
- 文法筆記
-
- 1. 數組方法:向數組開頭添加元素 arr.unshift()
- 字元串
了解數組
數組是一種基本的資料結構,用于按順序存儲元素的集合。但是元素可以随機存取,因為數組中的每個元素都可以通過數組索引來識别。
在JavaScript的數組對應Array對象
JavaScript Array對象
數組的方法
arr.splice()
arr.splice(index, number, item1…itemX)
用于添加、删除或修改數組中的元素
執行個體修改數組中的元素
var arr = [1, 2, 3, 4, 5]
arr.splice(0, 2, "a", "b")
console.log(arr) //["a", "b", 3, 4, 5]
arr.sort()
arr.sort([compareFunction])
用于對數組元素進行排序,預設排序順序是在将元素轉換為字元串toString(),然後比較它們的UTF-16代碼單元值序列時建構的。要對數字進行排序的話要設定compareFunction。
如果 compareFunction(a, b) 的傳回值小于 0 ,那麼 a 會被排列到 b 之前;
如果 compareFunction(a, b) 的傳回值等于 0 , a 和 b 的相對位置不變。備注: ECMAScript 标準并不保證這一行為,而且也不是所有浏覽器都會遵守(例如 Mozilla 在 2003 年之前的版本);
如果 compareFunction(a, b) 的傳回值大于 0 , b 會被排列到 a 之前。
通常對數字數組排序的方法如下
// 升序
arr.sort((a,b)=>a-b)
// 降序
arr.sort((a,b)=>b-a)
跟python的用法區分開,
// 升序
list.sort( key=None, reverse=False)
// 降序
list.sort( key=None, reverse=True)
arr.forEach()
array.forEach(function(currentValue, index, arr), thisValue)
用于調用數組的每個元素,并将元素傳遞給回調函數。
用forEach()求和
var sum = 0,
arr = [1,3,4]
arr.forEach(item => sum += item)
arr.reduce()
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
對數組中的每個元素執行一個reducer函數(升序執行),将其結果彙總為單個傳回值。
- accumulator 累計器累計回調的傳回值; 它是上一次調用回調時傳回的累積值,或initialValue。
- currentValue 數組中正在處理的元素。
reduce()的運作
[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){
return accumulator + currentValue;
});
用arr.reduce()求和
var arr = [1,3,4]
var sum = arr.reduce((sum, item) => sum + item)
arr.map()
array.map(function(currentValue,index,arr), thisValue)
對數組内每一項進行操作,并傳回操作後的新數組
對數組内的每一項求平方根
arr.map(Math.sqrt)
const data = [{name: 'cathy', num: 1}, {name: 'bob', num: 2}]
const a = data.map((item) => {
return item.num;
});
console.log(a) // [1, 2]
forEach()和map()的差別
- forEach(): 針對每一個元素執行提供的函數,直接改變原數組,隻傳回undefined。
- map(): 建立并傳回一個新的數組,其中每一個元素由調用數組中的每一個元素執行提供的函數得來,執行速度比forEach()快。
把arr中的值翻倍
arr = [1,2,3,4]
// forEach
arr.forEach((value, index)=>{
return arr[index] = value*2
})
// map
let new_arr = arr.map((value)=>{
return value * 2 // 注意函數要寫return才會有傳回值,如果不寫return就直接簡寫,不要花括号
})
能用forEach()做到的,map()同樣可以。反過來也是如此。
判斷數組内是否有某值
array.indexOf(searchElement)
如果存在傳回數組元素的下标,否則傳回-1
arr = [1,3,2]
arr.indexOf(3) // 1
array.includes(searchElement[, fromIndex])
如果存在傳回 true,否則傳回false。
fromIndex:從該索引處開始查找 searchElement。如果為負值,則按升序從 array.length + fromIndex 的索引開始搜尋。預設為 0。
arr = [1,3,2]
arr.includes(3) // true
arr.includes(3,2) //false
多元數組
統一初始值的二維數組
用new Array()建立二維數組如4*5大小,初始值為0。
在一維數組中循環new Array()建立第二層數組,并設定初始值
var arr = new Array()
for (var i = 0; i < 4; i++){
arr[i] = new Array()
for(var j = 0; j < 5; j++){
arr[i][j] = 0
}
}
合并已知數組建立多元數組
var arr_1 = [[1,2,3],[3,2,1]]
var arr_2 = [[4,5,6],[6,5,4]]
var arr_3 = []
for (var i = 0; i < 2; i++){
arr_3[i] = [arr_1[i], arr_2[i]]
}
得到arr_3是[[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]]
僞數組
僞數組是一個含有length屬性的json對象(即鍵值對),它是按照索引的方式存儲資料。在日常開發中,有許多的對象是由僞數組組成,比如函數内arguments對象,還有像調用getElementsByTagName, document.childNodes之類的,它們都傳回NodeList對象都屬于僞數組。
僞數組并不具有數組的一些方法,隻能能通過Array.prototype.slice轉換為真正的數組,并且帶有length屬性的對象。
obj = {0:"name",1:"age",length:2}
let arr = Array.prototype.slice.call(obj)
console.log(arr) // 輸出數組 ["name", "age"]
筆試題(拼多多)
編寫一個輸出日志的函數log,在輸出内容前面加上字首(app),如:
log(“Hello world”)傳回“(app)Hello world”
log(“Hello”,”world”)傳回”(app)Hello world”
function log(){
var args = Array.prototype.slice.call(arguments).join(" ")
console.log("(app)" + args)
}
log("hello world") // (app)hello world
log("hello", "world") // (app)hello world
關鍵是用arguments擷取輸入的參數(參數未知有幾個),然後用Array.prototype.slice.call把僞數組轉為數組,再join轉為字元串
算法題
leetcode (easy) 724. 尋找數組的中心索引
給定一個整數類型的數組 nums,請編寫一個能夠傳回數組“中心索引”的方法。
我們是這樣定義數組中心索引的:數組中心索引的左側所有元素相加的和等于右側所有元素相加的和。
如果數組不存在中心索引,那麼我們應該傳回 -1。如果數組有多個中心索引,那麼我們應該傳回最靠近左邊的那一個。
輸入:
nums = [1, 7, 3, 6, 5, 6]
輸出: 3
解釋:
索引3 (nums[3] = 6) 的左側數之和(1 + 7 + 3 = 11),與右側數之和(5 + 6 = 11)相等。
同時, 3 也是第一個符合要求的中心索引。
解題思路
1、觀察題目給出的三個元素的之間,存在關系:leftSum + sum[i] + rightSum = sum
2、leftSum和rightSum相等時,leftSum + sum[i] + leftSum = sum,隻要符合這個條件即可傳回目前i
3. 以終為始,res初始化為-1,如果不存在滿足條件的i時傳回-1
var pivotIndex = function(nums) {
let leftSum = 0,
sum = 0,
res = -1
nums.forEach((items)=>{sum+=items})
for(let i = 0; i < nums.length; i++){
if (leftSum == sum - nums[i] - leftSum){
res = i
break
}
leftSum += nums[i]
}
return res
};
文法筆記
1. 數組方法:數組求和 arr.forEach() / arr.reduce()
//array.forEach(function(currentValue, index, arr), thisValue)
let sum = 0
nums.forEach((items)=>{sum+=items})
//array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
let sum = nums.reduce((sum,items)=>sum+items,0)
//箭頭函數的用法:當箭頭函數函數體有多行語句,用 {} 包裹起來,表示代碼塊,當隻有一行語句,并且需要傳回結果時,可以省略 {} , 結果會自動傳回。如果要用{}就肯定要有個return,否則沒有傳回值,是以複雜一點的也可以這樣寫
let sum = nums.reduce((sum,items)=>{return sum+items},0)
2. 數組方法:對數組内每一項進行操作 arr.map()
//array.map(function(currentValue,index,arr), thisValue)
//對數組内的每一項求平方根
arr.map(Math.sqrt)
map
leetcode 66. 加一 (easy)
給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。
最高位數字存放在數組的首位, 數組中每個元素隻存儲單個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例 1:
輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。
解題思路
分情況讨論,首先明确無論進不進位都是從末尾開始加1
末位數加了1之後不進位,條件是這位數非9
1.1 直接把這位數加1
1.2 直接傳回數值,跳出循環
末位數加了1之後進一位,條件是這位數是9
2.1 先把這位數改成0
2.2 繼續判斷下一位數是不是9,是9進一位,非9直接加1即可。這裡看到了循環之前的做法,就想到用for循環倒序周遊,對每一位進行一次判斷。跳出循環的條件就是加到的這一位不用再進位
2.3 到首尾還是9,變成0之後自動跳出循環,最後在循環外面進一位,前面加一個1
var plusOne = function(digits) {
for( let i = digits.length - 1; i >= 0; i--){
if (digits[i] == 9){
digits[i] = 0
}else{
digits[i] += 1
return digits
}
}
digits.unshift(1)
return digits
};
文法筆記
1. 數組方法:向數組開頭添加元素 arr.unshift()
//添加一個數值
arr.unshift(1)
unshift
字元串
字元串實際上是一個 unicode 字元數組。可以執行幾乎所有在數組中使用的操作
JavaScript String對象
JavaScript 字元串