JS高级. 04 增删改查面向对象版歌曲管理、递归、
增 数组.push()
删 数组.splice(开始删除索引,删除几个)
在当前对象中调用当前对象的方法中和属性,必须用this调用
nodeType判断节点类型
节点.nodeType == 1:元素节点/2:属性节点/3:文本节点
concat 返回的是一个新的数组
封装歌曲列表管理(函数)
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <script>
- window.onload = function () {
- //给页面中所有的元素添加一个边框 1px solid pink
- //DOM中,没有提供直接获取后代元素的API
- //但是可以通过childNodes来获取所有的子节点
- //先找body的所有子元素
- //再找body的子元素的所有子元素
- function getChildNode(node){
- //先找子元素
- var nodeList = node.childNodes;
- //在用子元素再找子元素 这里就可以递归了
- //for循环中的条件,就充当了结束的条件
- for (var i = 0; i < nodeList.length; i++) {
- //childNode获取到到的节点包含了各种类型的节点
- //但是我们只需要元素节点 通过nodeType去判断当前的这个节点是不是元素节点
- var childNode = nodeList[i];
- //判断是否是元素节点
- if(childNode.nodeType == 1){
- childNode.style.border = "1px solid pink";
- getChildNode(childNode);
- }
- }
- }
- getChildNode(document.body);
- }
- </script>
- </head>
- <body>
- <div>1div
- <p>1p<span>1span</span><span>2span</span><span>3span</span></p>
- <p>5p<span>1span</span><span>2span</span><span>3span</span></p>
- </div>
- <div>10div
- <p>1p<span>1span</span><span>2span</span><span>3span</span></p>
- <p>5p<span>1span</span><span>2span</span><span>3span</span></p>
- </div>
- <p>我是第1个p标签</p>
- <p>我是第10个p标签</p>
- </body>
- </html>
面向对象封装歌曲管理

- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <script>
- function SongManager(){
- this.songList = null;
- }
- //在当前对象的方法中,调用当前对象的其他方法,需要使用this
- //例如 在 removeSong方法中调用 selectSong this.selectSong
- SongManager.prototype = {
- init:function (songList) {
- this.songList = songList;
- },
- addSong: function (song){
- this.songList.push(song);
- },
- removeSong:function (songName){
- var song = this.selectSong(songName);
- if(song == null){
- throw "您要删除的歌曲不存在!请重新尝试";
- }
- var index = this.songList.indexOf(song);
- this.songList.splice(index, 1);
- },
- updateSong: function (songName, singer) {
- var song = this.selectSong(songName);
- if(song == null){
- throw "您要修改的歌曲不存在!请重新尝试";
- }
- song.singer = singer;
- },
- selectSong: function (songName) {
- for (var k = 0; k < this.songList.length; k++) {
- var song = this.songList[k];
- if(song.songName == songName){
- return song;
- }
- }
- return null;
- }
- };
- var pwbDEManager = new SongManager();
- pwbDEManager.init([
- {
- songName:"青藏高原",
- singer:"潘文斌"
- },
- {
- songName:"我的换板鞋,摩擦摩擦最时尚",
- singer:"约翰逊,庞麦郎"
- }
- ]);
- pwbDEManager.addSong({
- songName:"东风破",
- singer:"Jay Chou"
- })
- var gjbDEManager = new SongManager();
- gjbDEManager.init([
- {
- songName:"两只老虎",
- singer:"高金彪"
- },
- {
- songName:"粉刷匠",
- singer:"高金彪"
- }
- ]);
- // gjbDEManager.removeSong("李白");
- gjbDEManager.removeSong("两只老虎");
- console.log(pwbDEManager.songList);
- console.log(gjbDEManager.songList);
- //要封装一个歌曲管理的工具
- //特征:歌曲列表
- //行为:增 删 改 查
- </script>
- </head>
- <body>
- </body>
- </html>

递归(练习在最底下)
1.在函数内调用函数自己,就是递归
2.函数不调用不占用内存
3.没有递归结束条件的递归就是死队规
递归的两个要素
1.自己调用自己
2.要有结束的条件
化归思想:把问题由难化易,化繁为简,有复杂变简单的过程成为化归

- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <script>
- window.onload = function () {
- //给页面中所有的元素添加一个边框 1px solid pink
- //DOM中,没有提供直接获取后代元素的API
- //但是可以通过childNodes来获取所有的子节点
- //先找body的所有子元素
- //再找body的子元素的所有子元素
- function getChildNode(node){
- //先找子元素
- var nodeList = node.childNodes;
- //在用子元素再找子元素 这里就可以递归了
- //for循环中的条件,就充当了结束的条件
- for (var i = 0; i < nodeList.length; i++) {
- //childNode获取到到的节点包含了各种类型的节点
- //但是我们只需要元素节点 通过nodeType去判断当前的这个节点是不是元素节点
- var childNode = nodeList[i];
- //判断是否是元素节点
- if(childNode.nodeType == 1){
- childNode.style.border = "1px solid pink";
- getChildNode(childNode);
- }
- }
- }
- getChildNode(document.body);
- }
- </script>
- </head>
- <body>
- <div>1div
- <p>1p<span>1span</span><span>2span</span><span>3span</span></p>
- <p>5p<span>1span</span><span>2span</span><span>3span</span></p>
- </div>
- <div>10div
- <p>1p<span>1span</span><span>2span</span><span>3span</span></p>
- <p>5p<span>1span</span><span>2span</span><span>3span</span></p>
- </div>
- <p>我是第1个p标签</p>
- <p>我是第10个p标签</p>
- </body>
- </html>

方式二

- <script>
- window.onload = function () {
- //给页面中所有的元素添加一个边框 1px solid pink
- //DOM中,没有提供直接获取后代元素的API
- //但是可以通过childNodes来获取所有的子节点
- //先找body的所有子元素
- //再找body的子元素的所有子元素
- function getChildNode(node){
- //先找子元素
- var nodeList = node.childNodes;
- var result = [];
- //在用子元素再找子元素 这里就可以递归了
- //for循环中的条件,就充当了结束的条件
- for (var i = 0; i < nodeList.length; i++) {
- //childNode获取到到的节点包含了各种类型的节点
- //但是我们只需要元素节点 通过nodeType去判断当前的这个节点是不是元素节点
- var childNode = nodeList[i];
- //判断是否是元素节点
- if(childNode.nodeType == 1){
- result.push(childNode);
- var temp = getChildNode(childNode);
- result = result.concat(temp);
- }
- }
- return result;
- }
- //1.第一次调用时获取body的所有子元素,会把所有的子元素全部放到result里面
- //2.每放进去一个 就找这个子元素的所有子元素 有返回值
- //3.把这个返回值和我们存当前子元素的数组拼接起来 就变成了 子元素 和 孙子元素的集合
- var arr = getChildNode(document.body);
- for (var i = 0; i < arr.length; i++) {
- var child = arr[i];
- child.style.border= "1px solid pink";
- }
- }
- </script>

递归
例子:
1, 2, 3, 4, 5, ..., 100 求和
首先假定递归函数已经写好, 假设是
foo
. 即foo(100)
就是求1
到100
的和寻找递推关系. 就是
n
与n-1
, 或n-2
之间的关系:foo( n ) == n + foo( n - 1 )
var res = foo(100);
var res = foo(99) + 100;
将递推结构转换为递归体
function foo(n){
return n + foo( n - 1 );
}
上面就是利用了化归思想:
将 求 100 转换为 求 99
将 求 99 转换为 求 98
...
将求 2 转换为 求 1
求 1 结果就是 1
即: foo( 1 ) 是 1
将临界条件加到递归体中(求1的结果为1)
function foo( n ) {
if ( n == 1 ) return 1;
return n + foo( n - 1 );
}
练习:
求 1, 3, 5, 7, 9, ... 第
n
项的结果与前n
项和. 序号从0
开始
先看求第n
项
首先假定递归函数已经写好, 假设是
fn
. 那么第n
项就是fn(n)
找递推关系:
fn(n) == f(n-1) + 2
递归体
function fn(n) {
return fn(n-1) + 2;
}
找临界条件
求 n -> n-1
求 n-1 -> n-2
...
求 1 -> 0
求 第 0 项, 就是 1
加入临界条件
function fn( n ) {
if ( n == 0 ) return 1;
return fn( n-1 ) + 2;
}
再看求前n
项和
假设已完成, sum( n ) 就是前 n 项和
找递推关系: 前 n 项和 等于 第 n 项 + 前 n-1 项的和
递归体
function sum( n ) {
return fn( n ) + sum( n - 1 );
}
找临界条件
n == 1
结果为 1
加入临界条件
function sum( n ) {
if (n == 0) return 1;
return fn(n) + sum(n - 1);
}
练习
2, 4, 6, 8, 10 第 n 项与 前 n 项和
解题方法和上一题一样。
练习
现有数列: 1, 1, 2, 4, 7, 11, 16, … 求 第 n 项, 求前 n 项和.
求第n
项
假设已经得到结果 fn, fn( 10 ) 就是第 10 项
找递推关系
0, 1 => fn( 0 ) + 0 = fn( 1 )
1, 2 => fn( 1 ) + 1 = fn( 2 )
2, 3 => fn( 2 ) + 2 = fn( 3 )
...
n-1, n => fn( n-1 ) + n - 1 = fn( n )
递归体也就清楚了
临界条件是 n == 0 => 1
function fn( n ) {
if ( n == 0 ) return 1;
return fn( n-1 ) + n - 1;
}
前n
项和
function sum( n ) {
if ( n == 0 ) return 1;
return sum( n - 1 ) + fn( n );
}
练习
Fibonacci 数列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … 求其第 n 项.
递推关系:fn(n) == fn(n-1) + fn(n - 2)
function fib( n ) {
if ( n == 0 || n == 1 ) return 1;
return fib( n - 1 ) + fib( n - 2 );
}
练习
阶乘:一个数字的阶乘表示的是从 1 开始 累乘到这个数字. 例如 3! 表示 1 2 3. 5! 就是 1 2 3 4 5. 规定 0 没有阶乘, 阶乘从1开始。
求n的阶乘
function foo ( n ) {
if ( n == 1 ) return 1;
return foo( n - 1 ) * n;
}
练习
求幂
求幂就是求 某一个数 几次方
2*2 2 的 平方, 2 的 2 次方
求 n 的 m 次方
最终要得到一个函数 power( n, m )
n 的 m 次方就是 m 个 n 相乘 即 n 乘以 (m-1) 个 n 相乘
function power ( n, m ) {
if ( m == 1 ) return n;
return power( n, m - 1 ) * n;
}
JS高级. 04 增删改查面向对象版歌曲管理、递归、的更多相关文章
- js操作indexedDB增删改查示例
js操作indexedDB增删改查示例 if ('indexedDB' in window) { // 如果数据库不存在则创建,如果存在但是version更大,会自动升级不会复制原来的版本 var r ...
- NX二次开发-NX访问SqlServer数据库(增删改查)C#版
版本:NX9+VS2012+SqlServer2008r2 以前我写过一个NX访问MySQL数据库(增删改查)的文章https://www.cnblogs.com/nxopen2018/p/12297 ...
- JS源生代码“增删改查”之增
51呢最近在做一个管理数据的,第一次接触到用JS的源代码去实现一些功能,才知道网页里的许多功能都是依赖于“增删改查”完成的,下面的几张图片就是对于增的演示: 下面是有关HTML的代码:这个主要是弹窗部 ...
- Node.js之mysql增删改查
1.安装库 npm install mysql 2.编写db.js(用作公共模块) //连接MySQL数据库 var mysql = require("mysql"); var p ...
- DOM操作 JS事件 节点增删改查
--------------------------习惯是社会的巨大的飞轮和最可贵的维护者.——威·詹姆斯 day 49 [value属性操作] <!DOCTYPE html><ht ...
- iOS 数据库的增删改查(OC版)
自己写了几个方法来实现数据的增删改查功能: 首先在TARGETS--->>Build phases里面添加数据库所关联的库文件libsqlite3.tbd 添加完以后,在控制器上添加 #i ...
- node.js封装数据库增删改查
数据库增删改查的封装 小编不容易 const sql = { insert: function (Collection, insertData) { return new Promise((resol ...
- js数组的增删改查
array 数组的增删改: push 从数组后面推入一个元素或多个元素 var arr = [1,2,3]; // 返回:修改后数组的长度 arr.push(4,5,6); pop 删除数组最后一 ...
- JS DOM节点增删改查 属性设置
一.节点操作 增 createElement(name)创建元素 appendChild();将元素添加 删 获得要删除的元素 获得它的父元素 使用removeChild()方法删除 改 第一种方 ...
随机推荐
- iDempiere 使用指南 绿色版一键启动测试环境
Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...
- App Inventor 网络资源及推荐书目
Ai2服务器 官方服务器:http://ai2.appinventor.edu/ 官方备用服务器:(大陆可用):http://contest.appinventor.mit.edu/ 国内个人服务器: ...
- 在Android Studio上进行OpenCV 3.1开发环境配置
开发环境: Windows 7 x 64 家庭版 Android Studio 1.5.1(Gradle版本2.8) JDK 1.8.0 Android 6.0(API 23) OpenCV 3.1. ...
- alter table fx.pet modify column `species` varchar(20) binary;
alter table fx.pet modify column `species` varchar(20) binary;
- 买卖股票的最佳时机 - C++
class Solution { public: /** * @param prices: Given an integer array * @return: Maximum profit */ in ...
- Java框架安全
(一)Mybatis注入问题 Mybatis是目前比较常用的ORM的框架,一般与SpringMVC框架整合较多,但使用不当会有SQL注入的风险. Mybatis里mapper中SQL语句的写法支持两种 ...
- HCNA配置静态LACP模式链路聚合
1.静态LACP模式 静态LACP模式是一种利用LACP协议进行聚合参数协商.确定活动接口和非活动接口的链路聚合方式.该模式下,需手工创建Eth-Trunk,手工加入Eth-Trunk成员接口,由LA ...
- adb工具包究竟能帮我们做什么?
adb工具包主要作用于什么呢?应该有很多用户都不了解adb,那就一起来了解一下吧!adb的全称为Android Debug Bridge,就是起到调试桥的作用. 借助adb工具,我们可以管理设备或手机 ...
- python操作oracle小测试
首先使用python操作数据库需要导入cx_Oracle包import cx_Oracle这个包需要单独下载,下载地址:https://pypi.python.org/pypi/cx_Oracle使用 ...
- nginx-rtmp加入权限验证的简单方法
nginx-rtmp-module默认不限制推流权限.播放权限.如果想加入权限验证,有很多种方法. 方法一:修改源码如: 如何给 nginx rtmp 服务加入鉴权机制 http://blog.csd ...