天天看點

JavaScript資料結構——數組了解數組數組的方法多元數組僞數組算法題字元串

目錄

  • 了解數組
  • 數組的方法
    • 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;
});
           
JavaScript資料結構——數組了解數組數組的方法多元數組僞數組算法題字元串

用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. 末位數加了1之後不進位,條件是這位數非9

    1.1 直接把這位數加1

    1.2 直接傳回數值,跳出循環

  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 字元串

繼續閱讀