js原型链函数覆盖问题
答案:1 悬赏:10 手机版
解决时间 2021-11-11 10:56
- 提问者网友:我一贱你就笑
- 2021-11-10 20:29
js原型链函数覆盖问题
最佳答案
- 五星知识达人网友:行雁书
- 2021-11-10 21:19
function(str = this.str)这里有语法错误。
sp.sortWay();//这个调用没有传入参数,由于判断是升序还是降序不是用this.str来做判断的,所以不能确定是降序还是升序。
sp2.sortWay(2);//sp2没有声名
另外排序函数可以精简
var arr = [
{ "name": "aa", "id": 1000, "sex": 0, "age": 28 },
{ "name": "bb", "id": 1001, "sex": 1, "age": 18 },
{ "name": "cc", "id": 1002, "sex": 0, "age": 18 },
{ "name": "cc", "id": 1003, "sex": 1, "age": 18 }
];
//1.升序
function upsort() {
var sortColumns = arguments;
return function (a, b) {
if (sortColumns.length == 0) {
return a - b;
}
for (var i = 0; i < sortColumns.length; i++) {
var compareResult = a[sortColumns[i]] - b[sortColumns[i]];
if (i == sortColumns.length - 1 || compareResult != 0) {
return compareResult;
}
}
}
}
//2.降序
function downsort() {
var sortColumns = arguments;
return function (a, b) {
if (sortColumns.length == 0) {
return b - a;
}
for (var i = 0; i < sortColumns.length; i++) {
var compareResult = b[sortColumns[i]] - a[sortColumns[i]];
if (i == sortColumns.length - 1 || compareResult != 0) {
return compareResult;
}
}
}
}
function sortPlugin() { }
sortPlugin.prototype.str = 1; //1为升序,2为降序,默认为升序
sortPlugin.prototype.sortWay = function (str) {
if (str != undefined) {
this.str = str;
}
if (this.str == 1) {
console.log(JSON.stringify(arr.sort(upsort("age", "sex", "id")))); //如果不转换为JSON字符串就输出,打印到console的结果将在鼠标点击展开的时候去获取,导致第一次调用和第二次调用都显的最后一次调用的结果
} else if (this.str == 2) {
console.log(JSON.stringify(arr.sort(downsort("age", "sex", "id"))));
}
}
var sp = new sortPlugin();
sp.sortWay(1);
sp.sortWay(2);这样写多个属性排序还不够完善,只能统一按升序或降序来排,还不能每个属性都按不同的排序,比如first属性按升序,second属性按降序,还可以进一步的优化。可以思考下如何实现类似C#里Linq排序,比如:
arr.orderBy(x => x.first).thenByDescending(x => x.second);
或者
arr.orderByDescending(x => x.first).thenBy(x => x.second);追问多谢大佬花时间解答,function(str = this.str)这样写没有问题,个人感觉加
if (str == undefined) { this.str = str; }
是为了更严谨,逻辑更清晰,另外如果输出结果不转换为JSON字符串,是什么机制导致鼠标点击才去获取,我的问题是出在这儿的,郁闷了好长时间
sp.sortWay();//这个调用没有传入参数,由于判断是升序还是降序不是用this.str来做判断的,所以不能确定是降序还是升序。
sp2.sortWay(2);//sp2没有声名
另外排序函数可以精简
var arr = [
{ "name": "aa", "id": 1000, "sex": 0, "age": 28 },
{ "name": "bb", "id": 1001, "sex": 1, "age": 18 },
{ "name": "cc", "id": 1002, "sex": 0, "age": 18 },
{ "name": "cc", "id": 1003, "sex": 1, "age": 18 }
];
//1.升序
function upsort() {
var sortColumns = arguments;
return function (a, b) {
if (sortColumns.length == 0) {
return a - b;
}
for (var i = 0; i < sortColumns.length; i++) {
var compareResult = a[sortColumns[i]] - b[sortColumns[i]];
if (i == sortColumns.length - 1 || compareResult != 0) {
return compareResult;
}
}
}
}
//2.降序
function downsort() {
var sortColumns = arguments;
return function (a, b) {
if (sortColumns.length == 0) {
return b - a;
}
for (var i = 0; i < sortColumns.length; i++) {
var compareResult = b[sortColumns[i]] - a[sortColumns[i]];
if (i == sortColumns.length - 1 || compareResult != 0) {
return compareResult;
}
}
}
}
function sortPlugin() { }
sortPlugin.prototype.str = 1; //1为升序,2为降序,默认为升序
sortPlugin.prototype.sortWay = function (str) {
if (str != undefined) {
this.str = str;
}
if (this.str == 1) {
console.log(JSON.stringify(arr.sort(upsort("age", "sex", "id")))); //如果不转换为JSON字符串就输出,打印到console的结果将在鼠标点击展开的时候去获取,导致第一次调用和第二次调用都显的最后一次调用的结果
} else if (this.str == 2) {
console.log(JSON.stringify(arr.sort(downsort("age", "sex", "id"))));
}
}
var sp = new sortPlugin();
sp.sortWay(1);
sp.sortWay(2);这样写多个属性排序还不够完善,只能统一按升序或降序来排,还不能每个属性都按不同的排序,比如first属性按升序,second属性按降序,还可以进一步的优化。可以思考下如何实现类似C#里Linq排序,比如:
arr.orderBy(x => x.first).thenByDescending(x => x.second);
或者
arr.orderByDescending(x => x.first).thenBy(x => x.second);追问多谢大佬花时间解答,function(str = this.str)这样写没有问题,个人感觉加
if (str == undefined) { this.str = str; }
是为了更严谨,逻辑更清晰,另外如果输出结果不转换为JSON字符串,是什么机制导致鼠标点击才去获取,我的问题是出在这儿的,郁闷了好长时间
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯