这里讲的数组是指数据结构中的数组,而不是专指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 = '' }