选择排序
思想
1. n 个数 进行n-1次选择
2. 每次选择
未排序数中找最小数下标,与前面的数交换位置
<script>
var arr = [89, 98, 78, 68, 76]
// 0 1 2 3 4
var n = arr.length
//外层循环
for (var i = 0; i < n - 1; i++) {
//找最小数下标
var minIndex = i //假设最小数下标是第一个数
for (var j = i+1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
//交换位置
var temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
console.log('第'+(i+1)+'次选择 ',arr)
}
console.log(arr)
</script>
数组去重
[9,2,5,2,8,2,5] -> [9,2,5,8]
方法一: 利用indexOf或includes实现
思路:
1. 定义一个空数组 [] 存储去重后元素
2. 遍历原数组
3. 判断新数组中是否有原数组当前元素,如果没有,存储到新数组中
<script>
/*
利用indexOf -1
includes false
*/
function testIndexOf() {
var arr = [9, 2, 5, 2, 8, 2, 5]
var newArr = [] //1.存储去重后元素
// 2. 遍历原数组
for (var i = 0; i < arr.length; i++) {
// 3. 判断新数组中是否有原数组当前元素,如果没有,存储到新数组中
// if(newArr.indexOf(arr[i]) == -1){
// newArr.push(arr[i])
// }
// if(newArr.includes(arr[i]) == false){
if (!newArr.includes(arr[i])) {
newArr.push(arr[i])
}
}
console.log(newArr)
}
testIndexOf()
function test2() {
var arr = [9, 2, 5, 2, 8, 2, 5]
var newArr = [] //存储去重后数组
arr.forEach(function (item) {
if (newArr.indexOf(item) == -1) {
newArr.push(item)
}
})
console.log(newArr)
}
test2()
/*
利用双重for循环+splice实现
外层循环遍历数组所有元素
内层循环依次判断后面元素是否与外层循环元素相同,如果相同,截取掉
*/
function test3() {
var arr = [2, 2, 2, 5, 2, 8, 2, 5]
// 0 1 2 3 4 5
// [2, 2, 5, 2, 8, 2, 5]
// 2
for (var i = 0; i < arr.length; i++) {
var item = arr[i] // 外层循环元素
for (var j = i + 1; j < arr.length; j++) {
if(item == arr[j]){
arr.splice(j,1)
j--
}
}
}
console.log(arr)
}
test3()
</script>
字符串
数据类型
基本数据类型
1. 创建字符串对象
var str = 'helloworld'
var str = new String('hellworld')
===========================
var obj = {} // 字面量
var obj = new Object() //构造函数方式
var arr = [] //字面量
var arr = new Array() //构造函数方式
2. 字符串是由一系列字符构成,每个字符对应自己下标,和数组类似,从0开始
helloworld
0123456789
3. 访问字符串字符
str[0]
不能赋值 str[0] = 'k'
4. length字符串长度
5. 字符串遍历
6. 字符串
基本数据类型?
复杂数据类型(对象类型)
属性和方法
通过点语句调用
var str = 'hellworld'
str.length
当使用点语句调用属性和方法时,自动转为复杂数据类型,使用完又转为基本数据类型: 包装类型
var str = 'hellworld'
基本数据类型 复杂数据类型
string -> String
str.length
number -> Number
89.888888 -> num.toFixed(2)
boolean -> Boolean
7. 常用方法
charAt
=>根据下标返回字符
indexOf
=>返回字符在字符串中的下标
=>如果字符不存在,返回-1
lastIndexOf
=>
substring slice
=>开始下标,结束下标(不包)
substr splice
=>开始下标,元素个数
var str = 'hellworld' // 字面量方式
// 012345678
console.log(str)
// var str1 = new String('helloworld') // 构造函数方式
// console.log(str1)
console.log('str[0] ',str[0])
console.log('str.charAt(0) ',str.charAt(0))
console.log( str.length )
for(var i = 0; i < str.length; i++){
// console.log(str[i])
}
// =======indexof===========
console.log('str.indexOf :',str.indexOf('l'))
console.log('str.lastIndexOf :',str.lastIndexOf('l'))
//=========substring======
console.log( 'substring ', str.substring(1,3) )
var arr = ['h','e','l','l','w','o','r','l','d']
var newArr = arr.slice(1,3)
console.log('newArr :', newArr)
// ==========substr===========
console.log('substr :', str.substr(1,3))
var newArr1 = arr.splice(1,3)
console.log( 'splice :', arr ,'newArr1 ', newArr1)
字符串的常用方法
replace(原字符串,新字符串)
=>返回新字符串
split('分割字符')
=>返回数组
// ======replace=========
function testReplace(){
var str = 'helloworld'
var newStr = str.replace('hello','javascript') // javascriptworld
console.log('newStr :',newStr);
}
//=======split===========
function testSplit(){
var str = 'javascript-css-html' // => ['javascript','css','html']
var arr = str.split('-')
console.log(arr)
}
// testSplit()
function testSplitTwo(){
var str = 'javascript1MMcss1MMhtml1' // => ['javascript','css','html']
var arr = str.split('MM')
console.log(arr)
}
// testSplitTwo()
function testSplitThree(){
var str = 'javascript' // =>['j','a','v','a','s','c','r','i','p','t']
var arr = str.split('')
console.log(arr)
}
// testSplitThree()
function testConcat(){
var str = 'hello'
var newStr = str.concat('world')
console.log(newStr)
}
// testConcat()
function testTrim(){
var str = ' jack '
console.log('str : ',str.length)
var newStr = str.trim()
console.log('newStr :',newStr.length)
}
// testTrim()
function testStartsWith(){
var str = 'helloworld'
var isOk = str.startsWith('hello')
console.log('isOk ',isOk)
}
// testStartsWith()
function testStartsWithTwo(){
var url = 'http://www.qianfeng.com'
var isOk = url.startsWith('http')
console.log('isOk ',isOk)
}
// testStartsWithTwo()
function testEndWith(){
var url = 'http://www.qianfeng.com'
var isOk = url.endsWith('.cn')
console.log('isOk ',isOk);
}
// testEndWith()
function testLowerCase(){
// var str = 'HELLO'
var str = 'div'
// var newStr = str.toLowerCase()
var newStr = str.toUpperCase()
console.log(newStr)
}
testLowerCase()
字符串练习
反转字符
分析: 'abcdefg' => 'gfedcba'
['a','b','c','d','e','f','g'] => arr.reverse()
字符串=>数组
'abcdefg' => ['a','b','c','d','e','f','g']
数组 =>字符串
arr.join('')
方法二:
倒序输出字符
拼接字符串
<script>
//反转字符串
function testReverse() {
var str = 'abcdefg'
var arr = str.split('') //字符串转数组
var newstr = arr.reverse() //反转
var news = newstr.join('') //数组转字符串
console.log(news);
}
testReverse()
function testReverseT() {
var str = 'abcdefg'
var newstr = ''
for (var i = str.length - 1; i >= 0; i--) {
// console.log(str[i]);
newstr = newstr + str[i]
}
console.log(newstr);
}
testReverseT()
/*
替换字符串
*/
function testReplace() {
var str = 'abcedfdMMefallMMaefeafMMopqrst' // => abcedfd**efall**aefeaf**opqrst
// console.log(str.replace(/M/g,'*'));
while (str.indexOf('MM') != -1) {
str = str.replace('MM', '**')
}
console.log(str);
}
testReplace()
/*
字符串分割
不使用split
*/
function testSplit() {
var str = 'javascript-html-css' // => ['javascript','css','html']
// var s = str.substr(0, 10)
// var t = str.substr(11, 4)
// var r = str.substr(16, 3)
// console.log(s, t, r);
var line = ''//拼接字符串
var arr=[]//储存分割内容
for (var i = 0;i<str.length;i++){
var chars = str.charAt(i)
if(chars != '-'){
line = line+chars
}else{
if(line !=''){
arr.push(line)
line=''
}
}
}
console.log(arr);
}
testSplit()
</script>
<script>
/*
反转字符
分析: 'abcdefg' => 'gfedcba'
['a','b','c','d','e','f','g'] => arr.reverse()
字符串=>数组
'abcdefg' => ['a','b','c','d','e','f','g']
数组 =>字符串
arr.join('')
方法二:
倒序输出字符
拼接字符串
*/
function testReverse() {
var str = 'abcdefg' // => gfedcba
var arr = str.split('') // ['a','b','c','d','e','f','g']
var arr1 = arr.reverse() // 反转 ['g','f','e','d','c','b','a']
var str1 = arr1.join('') // 'gfedcba'
console.log(str1)
}
// testReverse()
function testReverseTwo() {
var str = 'abcdefg'
var newStr = ''
for (var i = str.length - 1; i >= 0; i--) {
console.log(str[i])
newStr = newStr + str[i] // 'gfedcba'
}
console.log(newStr)
}
// testReverseTwo()
/*
替换字符串
敏感词过滤
*/
function testReplace() {
var str = 'abcedfdMMefallMMaefeafMMopqrst' // => abcedfd**efall**aefeaf**opqrst
var newStr = str.split('MM') // ['abcedfd','efall','aefeaf','opqrst']
var newStr1 = newStr.join('**') // 'abcedfd**efall**aefeaf**opqrst'
console.log(newStr1)
}
// testReplace()
function testReplaceTwo() {
var str = 'abcedfdMMefallMMaefeafMMopqrst'
// var newStr = str.replace('MM','**')
// console.log(newStr) //abcedfd**efallMMaefeafMMopqrst
// newStr = newStr.replace('MM','**')
// console.log(newStr) //abcedfd**efall**aefeafMMopqrst
// newStr = newStr.replace('MM','**')
// console.log(newStr)
// 判断子字符串是否在原字符串中
while (str.indexOf('MM') != -1) {
str = str.replace('MM', '**') //str = 'abcedfd**efall**aefeafMMopqrst'
}
console.log(str)
}
testReplaceTwo()
/*
字符串分割
不使用split
编程思想:
初始化空数组
初始化空字符串
循环遍历字符串
判断字符是否是'-'
如果不是'-'
拼接字符串 '' -> 'javascript'
如果是'-'
将拼接的字符串 存储到数组中
重置拼接字符串
*/
function testSplit() {
var str = 'javascript-html-css' // => ['javascript','css','html']
// var str1 = str.substr(0, 10)
// var str2 = str.substr(11, 4)
// var str3 = str.substr(16, 3)
// var newStr = []
// newStr.push(str1, str2, str3)
// console.log(newStr)
var line = '' //拼接字符串
var arr = [] //存储分割内容
for (var i = 0; i < str.length; i++) {
var chars = str.charAt(i)
if (chars != '-') {
line = line + chars //'javascript' 'css'
} else {
if (line != '') {
arr.push(line) //['javascript']
line = ''
}
}
// 将最后的line存储到数组
if (i == str.length-1 && line != '') {
arr.push(line)
line = ''
}
}
console.log(arr)
}
testSplit()
</script>