這裏講的數組是指數據結構中的數組,而不是專指js
中的數組,只是使用js
來探究數據結構中的數組,由於我以爲js
比較方便。git
數組有兩個要素:github
0,1,2,3,4
data1
-data5
數組的操做數組
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]
這裏咱們選擇最簡單的來實現init
:app
function init() { return [] }
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 }
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) }
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 }
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) }
固然,咱們日常並不會這麼使用js
,這只是爲了演示數組而已:
let data=[1,2,3] data.push(4) data.push(5) data.push(6) data.filter(d=>d===1) data.splice(0,1)
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_
將這個todo
從todoList
中移除,更新
按鈕點擊的時候只會將當前的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 = '' }