JS數據結構0x001:數組

0x000 概述

這裏講的數組是指數據結構中的數組,而不是專指js中的數組,只是使用js來探究數據結構中的數組,由於我以爲js比較方便。git

0x001 數組

  • 數組是啥?看圖:

    clipboard.png

  • 數組有兩個要素:github

    • 索引:圖中的0,1,2,3,4
    • 數據:圖中的data1-data5
      能夠經過索引找到某個數據,而後對這個數據操做,而這裏的數據是泛指,由於數組是一種通用的數據結構,能夠存儲任意的數據,好比數字、對象、字符串,甚至數組也能夠。
  • 數組的操做數組

    • 搜索
    • 添加/更新
    • 刪除

0x002 初始化

js中數組的初始化很簡單,方式也不少:數據結構

[] // []
[1,2,3,4,5,6,7] //[1,2,3,4,5,6,7]
new Array() //[]
new Array(10) // [ 10 empty items]
new Array(1,2,3,4,6) // [1,2,3,4,5,6]
Array.from([1,2,3,4,5],(a)=>a*2) // [2,4,6,8,10]
Array.from(new Set([1,2,3,3])) // [1,2,3]

這裏咱們選擇最簡單的來實現initapp

function init() {
    return []
}

0x002 插入

js中插入的方法也不少,每一個方法也都有本身的特點,其實js的數組就已經自帶實現了不少的數據結構dom

let data=[]
data[0]=1 // [1]
data.push(2) // [1, 2]
data=data.concat(3) // [1, 2, 3]
data=data.concat([4],5) // [1, 2, 3, 4, 5]

咱們依舊選擇最簡單索引方式,由於這比較符合數據結構中數組的使用,push是更適合其餘數據結構的操做。函數

function insert(arr, index, data) {
    arr[index] = data
    return arr
}

0x003 查找

js數組查找的方法也不少spa

let data = [1, 2, 3, 4, 5, 6]
data.find(d => d === 1) // 1
data[data.findIndex(d => d === 2)] //2
data.filter(d => d === 3)[0] // 3
data.forEach(d => {
    if (d === 4) {
        result = d // 4
    }
})  
for (let i = 0; i < data.length; i++) {
    if (data[i] === 5) {
        result = data[i] // 5
        break
    }
} 

for (var d of data) {
    if (d === 6) {
        result = d //6
        break
    }
}

咱們依舊採用最簡單的code

function find(arr, data) {
    return arr.find(d => d === data)
}

0x004 刪除

js的刪除...也有不少方法orm

let data = [1, 2, 3, 4, 5, 6] 
delete data[0] // [ <1 empty item>, 2, 3, 4, 5, 6 ]
data.pop() // [ <1 empty item>, 2, 3, 4, 5]
data.splice(0, 1) // [2, 3, 4, 5]

咱們依舊採用最簡單的

function delete_(arr, index) {
    arr.splice(index,1)
    return arr
}

0x005 使用

function main() {
    let arr = init()
    
    arr = insert(arr, 0, 1) // [1]
    arr = insert(arr, 1, 2) // [1, 2]
    arr = insert(arr, 2, 3) // [1, 2, 3]
    arr = insert(arr, 3, 4) // [1, 2, 3, 4]
    arr = insert(arr, 4, 5) // [1, 2, 3, 4, 5]
    arr = insert(arr, 5, 6) // [1, 2, 3, 4, 5, 6]
    
    find(arr, 1) // 1
    find(arr, 2) // 2
    find(arr, 3) // 3
    find(arr, 4) // 4
    find(arr, 5) // 5 
    
    delete_(arr, 0)
    delete_(arr, 1)
    delete_(arr, 2)
    delete_(arr, 3)
    delete_(arr, 4)
    delete_(arr, 5)
}

0x006 注意

固然,咱們日常並不會這麼使用js,這只是爲了演示數組而已:

let data=[1,2,3]
data.push(4)
data.push(5)
data.push(6)
data.filter(d=>d===1)
data.splice(0,1)

0x007 栗子:使用數組完成todoList

  • 效果
    圖片描述
  • todoService: 該文件用來提供todo的增刪改查服務

    let todoService = []
    
    /**
     * 獲取全部的 todo
*/
function getAll() {
    return todoService
}

/**
 * 添加一個 todo 到 todo 列表中
 * @param todo
 */
function add(todo) {
    todo.id = todoService.length
    todoService.push(todo)
}

/**
 * 根據 todo 的 id 刪除一個 todo
 * @param id
 * @private
 */
function delete_(id) {
    todoService.splice(findIndexById(id), 1)
}

/**
 * 根據一個修改過的 todo 更新 todo
 * @param todo
 */
function update(todo) {
    todoService[findIndexById(todo.id)] = {...todo}
}

/**
 * 根據內容篩選符合條件的 todo
 * @param content
 * @returns {*[]}
 */
function find(content) {
    return todoService.filter(todo => todo.content === content)
}

/**
 * 根據 id 獲取這個 id 在 todoList 中的索引
 * @param id
 * @returns {number}
 */
function findIndexById(id) {
    return todoService.findIndex(todo => todo.id === +id)
}

```
  • 視圖

    <body class="container">
        <div id="container">
            <div class="mt-1">
                <input class="form-control" type="text" id="inputContent">
                <div class="mt-1">
                    <button class="btn btn-primary" id="btnAdd">添加</button>
                    <button class="btn btn-info" id="btnSearch">搜索</button>
                    <button class="btn btn-warning" id="btnUpdate">更新</button>
                </div>
            </div>
            <div class="mt-1">
                <ul id="ulTodoList">
                </ul>
            </div>
        </div>
        </body>
  • 引入todoService

    <script src="./todoService.js.js"></script>
  • 初始化變量

    let $btnAdd = window.document.getElementById('btnAdd')
            let $btnSearch = window.document.getElementById('btnSearch')
            let $btnUpdate = window.document.getElementById('btnUpdate')
            let $ulTodoList = window.document.getElementById('ulTodoList')
            let $inputContent = window.document.getElementById('inputContent')
            let updateTodo
  • 完成添加按鈕的點擊事件

    當用戶輸入內容並點擊添加的時候,會根據輸入內容建立一個新的 todo,並調用 add將新的 todo保存到 todoList中,接着調用 render將全部的 todo渲染到 dom中,最後清空輸入框。
    $btnAdd.onclick = () => {
                let content = $inputContent.value
                add({content: content})
                render([...getAll()])
                $inputContent.value = ''
            }
  • 完成搜索按鈕點擊事件

    當用戶輸入內容並點擊搜索按鈕的時候,會根據輸入的內容調用 find,該函數返回了全部內容和輸入內容相同的 todo,將這些 todo渲染到 dom中就得到了搜索以後的 todo,最後清空輸入框。
    $btnSearch.onclick = () => {
                let content = $inputContent.value
                render(find(content))
                $inputContent.value = ''
            }
  • 完成todoLsit的渲染

    爲了方便,該函數直接將 ul的子元素所有清空,而後根據傳入的 todoList從新渲染子元素,其中爲每一個一個 todo建立了一個 刪除按鈕和 更新按鈕刪除按鈕點擊的時候講調用 delete_將這個 todotodoList中移除, 更新按鈕點擊的時候只會將當前的 todo保存到變量中,準備進行更新操做
    function render(todoList) {
                $ulTodoList.innerHTML = ''
                todoList.map((todo) => {
                    let $li = document.createElement('li')
                    $li.className = "mt-2"
        
                    let $span = document.createElement('span')
                    $span.innerText = todo.content
        
                    let $btnDelete = document.createElement('button')
                    $btnDelete.innerText = '刪除'
                    $btnDelete.className = 'btn btn-danger m-2'
                    $btnDelete.onclick = () => {
                        delete_(todo.id)
                        render([...getAll()])
                    }
        
                    let $btnUpdate = document.createElement('button')
                    $btnUpdate.innerText = '更新'
                    $btnUpdate.className = 'btn btn-warning m-2'
                    $btnUpdate.onclick = () => {
                        updateTodo = {...todo}
                        $inputContent.value = todo.content
                    }
        
                    $li.appendChild($btnDelete)
                    $li.appendChild($btnUpdate)
                    $li.appendChild($span)
                    $ulTodoList.appendChild($li)
                })
            }
  • 完成更新按鈕點擊事件

    render更新按鈕點擊的時候已經將要更新的 todo保存到 updateTodo中,當用戶修改輸入框內容並點擊更新的時候,就會將舊的 todo和新的 todo合併成更新後的 todo,而後調用 update去更新這個 todo,接着再 render一次,最後清空輸入框
    $btnUpdate.onclick = () => {
                update({...updateTodo, content: $inputContent.value})
                render([...getAll()])
                $inputContent.value = ''
            }

0x007 資源

相關文章
相關標籤/搜索