1. 关于数组排序

    排序一直是程序设计中的热门话题。在js中,数组有个sort()方法。在不传参数默认情况下,数组的sort()方法原理是:对数每项调用toString()方法,比较字符串按升序排序数组。看下面的例子。

var arrA = [null, undefined, 3, 2, 5, 21, {toString:function() {
return 1;
}, p:'hello'}];
var arrB = [undefined, null, 3, 2, 5, 21,{toString:function() {
return 1;
}, p: 'hello'}];
var arrC = [null, undefined, 3, 2, 21, {toString:function() {
return 1;
}, p:'hello'},
{a:1},
{toString:function(){return 'p'}},
{toString:function(){return 'oa'}},
{toString:function(){return 'p'}},
{toString:function(){return 'v'}}, 'u', 'v', 'nukk','nulk'
]; arrA.sort();//结果是:[Object, 2, 21, 3, 5, null, undefined]
arrB.sort();//结果是:[Object, 2, 21, 3, 5, null, undefined]
arrA.sort()[0].p;//hello
arrC.sort();

上面的例子说明:

a. sort()方法不传比较函数时,的确是对每项调用了toString()方法[对null应该是使用String(null)]转换成字符串再进行升序排序的

b. undefined不会参与排序,直接放最后面

当要使用其它标准对数组进行排序时,就要传入一个比较函数作为参数。原理及执行过程没有弄清楚(有知道的请告诉下),但得到如下结论:

var arrD = [3, 5, 1, 8, 10];

console.log(arrD.sort(compare));

function compare(v1, v2) {
var a = v1;
var b = v2;
console.log('v1='+v1 + '||'+ 'v2='+v2);
//return v1 - v2; //升序
//return v2 - v1;//降序
//return -1; //原样输出
//return 0; //原样输出
//return 1; //反顺输出
}

下面是一个实际Demo:

/**
* 为数组实现一个排序方法,能够num、string、date、character和object的排序,
* 对object类型排序时,按照某个属性排序。只考虑数组中存放都是相同类型的数据
* @param {Boolean} order 为true表示升序,false表示降序
* @param {String} key 对象的键值
*/
Array.prototype.sameTypeSort = function(order, key) {
var type = type(this[0]);
var ret = [], i = 0, temp, tempArr = [];
order = order ? true : false;
switch(type) {
case 'string':
ret = this.sort();//升序
break;
case 'number':
ret = this.sort(ascending);
break;
case 'date':
while(temp = this[i]) {
tempArr.push(temp.getTime());
i++;
}
tempArr.sort(ascending);
break;
default :
while(i < this.length) {
tempArr.push(this[i][key]);
i++;
}
tempArr = tempArr.sameTypeSort(true);
} //如果是时间,对象还要将还原成排序前的值
if(type === 'date') {
i = 0;
while(temp = tempArr[i]) {
ret.push(new Date(temp));
i++;
}
} if(type === 'object') {
i = 0;
while(temp = tempArr[i]) {
for(var start = 0, curObj, value; curObj = this[start]; start++) {
value = curObj[key];
if(value === temp) {
ret.push(curObj);
break;
}
}
i++;
}
} return order ? ret : ret.reverse(); function type(target) {
return ({}).toString.call(target).slice(8, -1).toLocaleLowerCase();
}
function ascending(v1, v2) {
return v1 - v2;
}
};

下面是通过的Qunit的测试代码:

test( "数值排序", function() {
var arr = [1,11,2,22,3,33,-5,-55, 0];
var upOrder = [-55, -5, 0, 1,2,3,11,22, 33]; propEqual(arr.sameTypeSort(true), upOrder, 'pass');
propEqual(arr.sameTypeSort(false), upOrder.reverse(), 'pass');
}); test( "字符串排序", function() {
var arr = ['aa', 'ac', 'ab', 'bc', 'ba', 'acd'];
var upOrder = ['aa', 'ab', 'ac', 'acd', 'ba', 'bc']; propEqual(arr.sameTypeSort(true), upOrder, 'pass');
propEqual(arr.sameTypeSort(false), upOrder.reverse(), 'pass');
}); test( "时间排序", function() {
var arr = [new Date('2014/06/16 0:0:0'), new Date('2014/06/12 0:0:0'), new Date('2014/06/14 0:0:0')]; strictEqual(arr.sameTypeSort(true)[0].getTime(), arr[1].getTime());
strictEqual(arr.sameTypeSort(false)[0].getTime(), arr[0].getTime());
}); test( "对象排序", function() {
var arr = [
{key:5, f: 'x'},
{key:2, f:'y'},
{key:6, f:'z'}
]; strictEqual(arr.sameTypeSort(true, 'key')[0].f, 'y');
strictEqual(arr.sameTypeSort(false, 'key')[0].f,'z');
console.log(arr.sameTypeSort(true, 'key'));
console.log(arr.sameTypeSort(false, 'key'));
});

2. match,replace函数练习

a. 价格千分

/**
* 在整数部分对费用进行千分。一开始想用正则来做,但实现过程中发现各种问题,最后代码变成下面的样子了
* @param {String} feeStr 有效的费用数值字符串
* @returns {String} 进行了千分格式化后的字符串
*/
function splitFee(feeStr) {
var ret, leftCtx, rightCtx; ponintPos = feeStr.indexOf('.');
if(ponintPos !== -1) {
leftCtx = feeStr.substring(0, ponintPos);
rightCtx = feeStr.substring(ponintPos+1);
} else {
leftCtx = feeStr;
rightCtx = '';
} /*match = feeStr.match(/\./);
leftCtx = RegExp.leftContext;//整数部分
rightCtx = RegExp.rightContext; 使用正则会有一个Bug,若后面match匹配失败,后面的rightCtx始终会保存前次匹配的值*/
leftCtx = leftCtx ? leftCtx : feeStr;
rightCtx = rightCtx ? '.'+rightCtx : ''; ret = (leftCtx.split('').reverse().join('').replace(/(\d{3})/g, function(m, ms, offset, targetStr) {
return m + ','
}).split('').reverse().join('')+rightCtx).replace(/^\,/,''); return ret;
}

通过的Qunit测试代码

test( "replace, match练习:数值字符串千分", function() {
//对整数部分进行千分
var fee1 = '1747136.51';
var fee2 = '277136.52';
var fee3 = '37136.53';
var fee4 = '47136';
var fee5 = '136'; strictEqual(splitFee(fee1), '1,747,136.51');
strictEqual(splitFee(fee2), '277,136.52');
strictEqual(splitFee(fee3), '37,136.53');
strictEqual(splitFee(fee4), '47,136');
strictEqual(splitFee(fee5), '136');
});

b. 交换包含两个单词的字符串

/**
* 交换单词字符串中的两个单词
* @param str
* @returns {String}
*/
function swapTwoWords(str) {
return str.replace(/(\w+)\s(\w+)/, '$2 $1');
//return str.split(' ').reverse().join(' '); 使用数组
} //Qunit测试
test( "replace练习:交换单词", function() {
var str = 'hello world'; strictEqual(swapTwoWords(str), 'world hello');
});

c. 字符串模板替换方法

/**
* 字符串模板替换方法
* @param {String} str
* @param {Object} obj
*/
function format(str, obj) {
return str.replace(/({\w+})/gm, function(m, ms, offset, targetStr) {
return obj[m.substring(1, m.length - 1)];
});
} //Qunit测试
test( "字符串模板format方法", function() {
var str = '<div>{id}</div></div>{name}</div>'; strictEqual(format(str, {id:100, name:'xyz', address:'cd'}), '<div>100</div></div>xyz</div>');
});

数组排序,字符串math,replace练习的更多相关文章

  1. JavaScript 字符串 & Math & Date

    字符串 字符串就是零个或多个排在一起的字符,放在单引号或双引号之中. 'abc' "abc" 单引号字符串的内部,可以使用双引号.双引号字符串的内部,可以使用单引号. 'key=& ...

  2. js中字符串的replace方法区分单双引号

    今天遇到一问题,js文件中调用字符串的replace方法,不起作用. 后来排查可能觉得replace("<option  value='1'>admin</option&g ...

  3. 浅谈JavaScript的字符串的replace方法

    JavaScript字符串提供了一个replace方法.replace方法可以接受两个参数:第一个参数可以使RegExp对象或者一个字符串,第二个参数可以是一个字符串或者一个函数.如果第一个参数是字符 ...

  4. 字符串替换replace方法

    字符串替换replace方法: http://www.w3school.com.cn/jsref/jsref_replace.asp http://www.cnblogs.com/skywang/ar ...

  5. js常用的数组,,字符串,,Math..正则方法

    数组 slice[start,end] 返回从原数组中指定开始下标到结束下标之间的项目组成新数组(不会影响原数组) splice() 1.删除功能:2个参数 , 起始位置 , 删除的项目 2.插入功能 ...

  6. 数组/字符串/ Math / 方法示例

    数组 Array concat  数组的合并 <script> var north = ["北京","上海","深圳"]; va ...

  7. 字符串的replace()方法隐藏着什么不可告人秘密?

    最近在做JS算法项目时发现一个令我匪夷所思的问题, 这里想记录一下问题. 首先介绍一下字符串replace()方法的基本用法. replace() 方法使用一个替换值(replacement)替换掉一 ...

  8. C# 字符串替换Replace

    C# 中的石strA.Replace(strB,strC)函数可以实现将strA中的strB替换为strC. 但是容易出错的地方是,这并不是就直接替换好了,此函数的返回值才是替换好的字符串,所以还要要 ...

  9. JavaScript——关于字符串的replace函数中的function函数的参数

    <!DOCTYPE> <html> <head> </head> <body> <script type="text/jav ...

随机推荐

  1. TCP与UDP的不同接包处理方式

    TCP与UDP的不同接包处理方式 1.UDP发包的问题问:udp 发送两次数据,第一次 100字节 ,第二次200字节, 接包方一次recvfrom( 1000 ), 收到是 100,还是200,还是 ...

  2. 8 simple things that will make you sexy

    8 simple things that will make you sexy8种方法教你不动声色的性感What makes a women sexy? Is it her body? Is it t ...

  3. Zabbix简介(第一章第一节)

    Alexei Vladishev创建了Zabbix项目,当前处于活跃开发状态,Zabbix SIA提供支持. Zabbix是一个企业级的.开源的.分布式的监控套件 Zabbix可以监控网络和服务的监控 ...

  4. android中使用html作布局文件

    在android开发中,通常使用xml格式来描述布局文件.就目前而言,熟悉android布局及美化的人员少之又少,出现了严重的断层.大部分企业,其实还是程序员自己动手布局.这样既浪费时间和精力,也未必 ...

  5. linux 操作系统下c语言编程入门

    2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理  ...

  6. android调试工具DDMS

    DDMS工作机制    DDMS全称Dalvik Debug Monitor Service.DDMS为IDE和emultor及真正的android设备架起来了一座桥梁,Android DDMS将捕捉 ...

  7. sql语句的基本操作

    建立一个数据库 create DATABASE mydatabase; 建立一张数据表: ##创建一个员工表##create table employee( eid int not NULL PRIM ...

  8. leetcode:Invert Binary Tree

    Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1即反转二叉树,代码如下: /** * Defin ...

  9. java中String类学习

    java中String类的相关操作如下: (1)初始化:例如,String s = “abc”; (2)length:返回字符串的长度. (3)charAT:字符操作,按照索引值获得字符串中的指定字符 ...

  10. Asp.net Web Api进行Nunit测试

    有两种方式 1.模拟Web请求. 2.直接本地调用Api接口 但是由于本地直接调用没有模拟请求环境,所以request为null public static HttpResponseMessage C ...