前言
作为前端开发者而言,可能不会像后端开发那样遇到很多的算法和数据结构问题,但是不论是做前端、 服务端还是客户端, 任何一个程序员都会开始面对更加复杂的问题, 这个时候算法和数据结构知识就变得不可或缺,它是编程能力中很重要的一部分。
一、数组
1.字符串分割为数组split与数组元素拼接转字符串join
var sentence = "the quick brown fox jumped over the lazy dog";
/**1. * 字符串.split(分隔符) 将字符串生成为数组 * */
var words = sentence.split(" ");
for (var i = 0; i < words.length; ++i) {
print("word " + i + ": " + words[i]);
}
/**2. * 数组转字符串 * .join(分隔符) * 数组各元素间放分隔符并连接成一个字符串 * join("") 就是 直接将数组个元素拼接起来生字符串 * .toString()连接成字符串后 默认中间会用,隔开 * */
2.indexOf-查找数组是否存在某元素及下标
var names = ["David","Cynthia","Raymond","Clayton","Jennifer"];
putstr("Enter a name to search for: ");
var name = readline();
/**1. * 数组.indexOf(参数值) 参数值是否存在于数组, * 存,返第一个出现该元素的下标; * 不存,返-1; * * 数组.lastIndexOf(参数值) * 反序找第一个的下标(如果出现,否则返-1) * * */
var position = names.indexOf(name);
if (position >= 0) {
print("Found " + name + " at position " + position);
} else {
print(name + " not found in array.");
}
3.数组中间添加和删除修改元素splice
/**1.splice() 将现有数组进行截取,返回所截取生成出来的数组,且现有数组改变,是截取后的数组
* 可用于为一个数组增加或移除或修改元素
* 参数一:截取(删除)的起始索引(0是第一个元素)
* 参数二:截取(删除)的元素的个数
* 参数三:删除截取后要添加进数组的元素(可以是个数组)
* */
/**2. 数组中间插入元素(放在数组里插入)* */
var nums = [1,2,3,7,8,9];
var newElements = [4,5,6];
nums.splice(3,0,newElements);
print(nums); // 1,2,3,4,5,6,7,8,9
/**3. 要插入数组的元素不必组织成一个数组, 它可以是任意的元素序列* */
var nums = [1,2,3,7,8,9];
nums.splice(3,0,4,5,6);
print(nums);
/**4. 从数组中删除元素 * */
var nums = [1,2,3,100,200,300,400,4,5];
nums.splice(3,4);
print(nums); // 1,2,3,4,5
4.不生成新数组的迭代器方法-forEach每个元素都操作-every所有都满足-some有一个满足-reduce累计操作
/* 1. 数组.forEach(func) 对数组每个元素执行某操作
* 它接受一个函数作为参数,对数组中的每个元素使用该函数
* */
function squareFunc(num) {
print(num, num * num); //打印多个字符的时候自动中间会加空格
}
var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
nums.forEach(squareFunc);
/**2. 数组.every(func), 检查数组中每个元素是否满足某条件
* 它接受一个返回值为布尔类型的函数, 对数组中的每个元素使用该函数。
* 如果对于所有的元素,该函数均返回 true, 则该方法返回 true
* 数组.some(func)
* 是否存在一个元素满足
* 也接受一个返回值为布尔类型的函数, 只要有一个元素使得该函数返回 true,
* 该方法就返回 true
* */
function isEven(num) {
return num % 2 == 0;
}
var nums = [2, 4, 6, 8, 10];
var even = nums.every(isEven);
if (even) {
print("all numbers are even");
} else {
print("not all numbers are even");
}
/** 3. reduce() 数组中的各个元素累计进行操作
* 它接受一个函数, 返回一个值。 该方法会从一个累加值开始, 不断对累加值和
* 数组中的后续元素调用该函数, 直到数组中的最后一个元素, 最后返回得到的累加值。
* */
//使用 reduce() 方法为数组中的元素求和:
function add(runningTotal, currentValue) {
return runningTotal + currentValue;
}
var nums = [1,2,3,4,5,6,7,8,9,10];
var sum = nums.reduce(add); //
print(sum); // 显示 55
//reduce() 方法也可以用来将数组中的元素连接成一个长的字符串
function concat(accumulatedString, item) {
return accumulatedString + item;
}
var words = ["the ", "quick ","brown ", "fox "];
var sentence = words.reduce(concat);
print(sentence); // 显示 "the quick brown fox"
/** 4.reduceRight() 方法,从右到左执行。
* 下面的程序使用 reduceRight() 方法将数组中的元素进行翻转:
* */
function concat(accumulatedString, item) {
return accumulatedString + item;
}
var words = ["the ", "quick ","brown ", "fox "];
var sentence = words.reduceRight(concat);
print(sentence); // 显示 "fox brown quick the"
5.二维数组和多维数组
/** 1.创建二维数组
* 比较好的方式是遵照 JavaScript: TheGood Parts( O’Reilly) 一书第 64 页的例子,
* 通过扩展 JavaScript 数组对象, 为其增加了一个新方法,
* 该方法根据传入的参数, 设定了数组的行数、 列数和初始值
* */
Array.matrix = function(numrows, numcols, initial) {
var arr = [];
for (var i = 0; i < numrows; ++i) {
var columns = [];
for (var j = 0; j < numcols; ++j) {
columns[j] = initial;
}
arr[i] = columns;
}
return arr;
}
//测试该生成二维数组方法的一些测试代码
var nums = Array.matrix(5,5,0);
print(nums[1][1]); // 显示 0
var names = Array.matrix(3,3,"");
names[1][2] = "Joe";
print(names[1][2]); // display"Joe"
/** 还可以仅用一行代码就创建并且使用一组初始值来初始化一个二维数组:
* 对于小规模的数据, 这是创建二维数组最简单的方式。
* */
var grades = [[89, 77, 78],[76, 82, 81],[91, 94, 89]];
print(grades[2][2]); // 显示 89
/** 2.处理二维数组的元素
* 两种最基本的方式: 按行访问和按列访问
* 按行访问:
* 外层循环对应行,内层循环对应列,每次对每一行的元素进行一些操作
* 以数组 grades 为例, 每一行对应一个学生的成绩记录。
* 可以将该学生的所有成绩相加, 然后除以科目数得到该学生的平均成绩。
* */
* var grades = [[89, 77, 78],[76, 82, 81],[91, 94, 89]];
var total = 0;
var average = 0.0;
for (var row = 0; row < grades.length; ++row) {
for (var col = 0; col < grades[row].length; ++col) {
total += grades[row][col];
}
average = total / grades[row].length;
print("Student " + parseInt(row+1) + " average: " +
average.toFixed(2));
total = 0;
average = 0.0;
}
/** 按列访问:
* 外层循环对应列,内层循环...,每次对每一列的元素进行一些操作
* 下面的程序计算了一个学生各科的平均成绩,即:每一列的数据想加取平均值:
* */
var grades = [[89, 77, 78],[76, 82, 81],[91