js常见算法
1:实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制。
function clone(Obj) {
var buf;
if (Obj instanceof Array) {
buf = []; //创建一个空的数组
buf=buf.concat(obj)//连接数组
return buf;
}else if (Obj instanceof Object){
buf = {}; //创建一个空对象
for (var k in Obj) { //为这个对象添加新的属性
buf[k] = clone(Obj[k]);
}
return buf;
}else{ //普通变量直接赋值
return Obj;
}
}
ps:该题的思路是判断数据类型,需要注意:基本类型复制的是副本,引用类型复制的是地址。
var person1= new Object();
person1.name = "张三"; //person1指向了栈内存的空间地址
var person2 = person1; //person2获得了person1的指向地址
person2.name = "李四";//因为他们都指向同一个object,同一个name,不管修改谁,大家都修改了
console.log(person1.name+'\n'+person2.name)
2:js数组去重
方法一:
var arr = [1,6,3,9,4,9,3,8,2];
var obj = {},newArr = [];
function Repeat(){
for(var i=0,j=arr.length;i<j;i++){
if(!obj[arr[i]]){
newArr.push(arr[i]);
obj[arr[i]] = arr[i];
}
}
}
Repeat();
newArr//打印新数组
该题思路是声明一个空数组和一个空对象,循环判断,让对象的属性和值都等于数组的项数,当对象中没有这个属性时,为新数组添加元素。
当然还有更简便的做法是,是使用indexOf()方法,该方法接受一个参数,返回该参数在数组中第一次出现的位置。如果没有则返回-1;那么上述函数可以改写成这样:
var arr = [1,6,3,9,4,9,3,8,2];
var newArr = [];
function Repeat(){
for(var i=0,j=arr.length;i<j;i++){
if(newArr.indexOf(arr[i])=="-1"){//如果newArr里没有arr[i],则添加新元素。
newArr.push(arr[i]);
}
}
return newArr;
}
Repeat();
newArr//打印新数组
3:数组排序。
js数组排序原生有sort();可以实现数组排序。在默认情况下,sort()方法按升序排列数组项,如果该方法没有参数按照字符编码的顺序进行排序。
var values = [0, 1, 5, 10, 15];
values.sort();
alert(values); //0,1,10,15,5
不用说,这种排序方式在很多情况下都不是最佳方案。
因此sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。比较函数接收两个参数,
如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等,则返回0,如果第一个参数应该位于第二个之后则返回一个正数。以下就是一个简单的比较函数:
function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}
var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values); // 15,10,5,1,0
这个比较函数可以适用于大多数数据类型。当然,也可以通过比较函数产生降序排序的结果,只要交换比较函数返回的值即可。
如果用原生的方法实现,那么就要用到冒泡排序,该方法思路是数组的前一项和后一项比较,如果前一项大于后一项,那么交换位置。代码如下:
var arr = [0, 6, 8, 6, 4, 3, 85, 5];
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
var t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
该段代码实现了升排序,如果实现降序,改变比较符号即可。
4:生成16进制随机颜色。
function randomColor(){
var arrHex=["0","2","3","4","5","6","7","8","9","a","b","c","d"],
strHex="#",
index;
for(var i=0;i<6;i++){
index=Math.round(Math.random()*12+0);
strHex+=arrHex[index];
}
return strHex;
}
randomColor();
关键代码:Math.round(Math.random()*12+0);
Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数
Math.random()方法返回大于等于0 小于1 的一个随机数。
对于某些场景来说,这个方法非常实用,因为可以利用它来随机显示一些名人名言和新闻事件。套用下面的公式,就可以利用Math.random()从某个整数范围内随机选择一个值。
公式: 值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值);
举例来说,如果你想选择一个1到10 之间的数值,可以像下面这样编写代码:
var num = Math.floor(Math.random() * 10 + 1);
由于数组下标从0开始,那么就有Math.round(Math.random()*12+0);从中选取随机字符串拼成颜色值。
5:一个字符串中出现次数最多的字符,并统计次数?
var str = 'asdfssaaasasasasaa';
var json = {};//存储出现所有字符和个数
for (var i = 0; i < str.length; i++) {
if(!json[str[i]]){ //如果对象没有这个,赋值为1
json[str[i]] = 1
}else{//如果有自加1
json[str[i]]++
}
}
//上述代码是为了让字符串每一字符。如果存在那么每次迭代自加1,如果没有,则将数组项数作为对象属性,值为1;
var max = 0;//次数
var index = "";//字符串
for(var s in json){
if (json[s] > max){
max = json[s];
index = s;
}
}
console.log(max,index)
6:把URL参数解析为一个对象?
function parseQueryString(url) {
var obj = {};
if(url.indexOf('?')==-1){
return obj;
}
var a = url.split('?');
var b = a[1].split('&');
for (var i = 0,length = b.length; i < length; i++) {
var c = b[i].split('=');
obj[c[0]] = c[1];
}
return obj;
}
var url = 'http://witmax.cn/index.php?key0=0&key1=1&key2=2';
var obj = parseQueryString(url);
console.log(obj );
split() 方法用于把一个字符串分割成字符串数组。该方法接受一个参数,从该参数指定的地方分割。
indexOf()方法,该方法接受一个参数,返回该参数在字符串中第一次出现的位置。如果没有则返回-1;
该题思路是,先使用indexOf();判断url是否有参数,如果没有则返回一个空对象;
如果有,则将参数和url分开。得到a[1]即为参数;再调用a[1].split('&');将每个参数与值存放数组里面。循环迭代,使用b[i].split('=');将b数组每一项分隔,
数组每一项都是:c[0]为属性,c[1]为值;
依次为obj对象添加属性,最后得到的即为想要结果。
js常见算法的更多相关文章
- Js常见算法实现汇总
/*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.length; for(var ...
- JS常见算法题目
最近收集了几个经典JS题目,比较有代表性,分享一下: 1.xiaoshuo-ss-sfff-fe 变为驼峰xiaoshuoSsSfffFe function getCamelCase(str ...
- js常见算法(一)
1.每个单词手字母大写 var capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase( ...
- 常见算法是js实现汇总(转载)
常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...
- JS中常见算法问题
JS中常见算法问题 1. 阐述JS中的变量提升(声明提前) 答:将所有的变量提升当当前作用域的顶部,赋值留在原地.意味着我们可以在某个变量声明前就使用该变量. 虽然JS会进行变量提升,但并不会执行真正 ...
- 前端常见算法的JS实现
1.冒泡排序 function bubbleSort(arr){ var i = 0, j = 0; for(i=1; i<arr.length; i++){ for(j=0; j<=ar ...
- 前端常见算法JS实现
算法是程序的灵魂,一个优秀的前端工程师对算法也是要有所了解的. 排序算法 1. 冒泡排序 //冒泡排序 function bubbleSort(arr){ var i = j = 0; for(i=1 ...
- js的 算法 和 数据结构
js的 算法 1.对一个对象数组按照对象某个属性进行排序 : https://www.cnblogs.com/webcabana/p/7460038.html 在做公交的项目中就碰到过这种算法问题, ...
- 总结下js排序算法和乱序算法
其实本人最怕的就是算法,大学算法课就感觉老师在讲天书,而且对于前端来说,算法在实际的应用中实在是很有限.毕竟算法要依靠大量的数据为基础才能发挥出算法的效率,就浏览器那性能,......是吧,退一万步说 ...
随机推荐
- BZOJ 1101 [POI2007]Zap ——Dirichlet积
[题目分析] Dirichlet积+莫比乌斯函数. 对于莫比乌斯函数直接筛出处理前缀和. 对于后面向下取整的部分,可以分成sqrt(n)+sqrt(m)部分分别计算 学习了一下线性筛法. 积性函数可以 ...
- Java XML解析器
使用Apache Xerces解析XML文档 一.技术概述 在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组 ...
- Codeforces 320A Magic Numbers
因为晚上有一个cf的比赛,而自己从来没有在cf上做过题,就找了道题熟悉一下. 题目大意:给一个数,判断是否能由1,14,144三个数连接得到. 代码如下: #include <stdio.h&g ...
- [项目回顾]基于Redis的在线用户列表解决方案
迁移:基于Redis的在线用户列表解决方案 前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案 ...
- OC纯代码全手工打造ScroolView实现翻页
OC纯代码全手工打造ScroolView实现翻页 1. 概述 分为三部分: 上部标题ScrollView 下部内容ScrollView 上部当前页 标示线 2. 效果 上下两部分都随着手势的滑动一块滑 ...
- 判断activity是否显示在界面上
boolean result = false; ActivityManager am = (ActivityManager) context .getSystemService(Context.ACT ...
- Java中间件:淘宝网系统高性能利器(转)
淘宝网是亚太最大的网络零售商圈,其知名度毋庸置疑,吸引着越来越多的消费者从街头移步这里,成为其忠实粉丝.如此多的用户和交易量,也意味着海量的信息处理,其背后的IT架构的稳定性.可靠性也显得尤为重要.那 ...
- 【翻译】使用Visual Studio创建Asp.Net Core MVC (一)
This tutorial will teach you the basics of building an ASP.NET Core MVC web app using Visual Studio ...
- js原生设计模式——3简单工厂模式\js面向对象编程实例
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一)
引言 现在做游戏开发的没有几个不用Excel的,用的最多的就是策划.尤其是数值策划,Excel为用户提供强大的工具,各种快捷键,各种插件,各种函数.但是作为程序来说其实关注的不是Excel而是它最终形 ...