最近在做一个项目,Ajax从后台返回数据后,前端用js处理时,发现无论如何使用sort排序,最终要么是没改变,要么只改变最后一次的排序,折腾了很久,最后查了查资料才发现,js中区分浅拷贝和深拷贝。
var provinceConfirmedCount = data; var provinceDeadCount = data; var provinceCuredCount = data; provinceConfirmedCount.sort(sortBy(("provinceConfirmedCount"))); provinceDeadCount.sort(sortBy(("provinceDeadCount"))); provinceCuredCount.sort(sortBy(("provinceCuredCount"))); console.log(provinceConfirmedCount); //不生效 console.log(provinceDeadCount); //不生效 console.log(provinceCuredCount); //生效//比较数组对象function sortBy(field) { return function(a,b) { return parseInt(b[field]) - parseInt(a[field]); }}
登录后复制
浅拷贝、深拷贝与赋值
这三个的区别无法就是改变数据的时候,是如何改变,为了简单明了,用一张表最快理解:
是否指向同一对象第一层为基本数据类型原数据中包含子对象赋值是会使原数据一同改变会使原数据一同改变浅拷贝否不会使原数据一同改变会使原数据一同改变深拷贝是不会使原数据一同改变不会使原数据一同改变
解决方案
既然知道了原理,这里的需求是需要全部改变,所以我们可以采用JQuery中的extend方法来处理:
var provinceConfirmedCount = $.extend([], data); var provinceDeadCount = $.extend([], data);; var provinceCuredCount = $.extend([], data);; provinceConfirmedCount.sort(sortBy(("provinceConfirmedCount"))); provinceDeadCount.sort(sortBy(("provinceDeadCount"))); provinceCuredCount.sort(sortBy(("provinceCuredCount"))); console.log(provinceConfirmedCount); console.log(provinceDeadCount); console.log(provinceCuredCount);
登录后复制
语法:$.extend( target, [object1], [objectN] )其中,target为目标类型,这里我用的是数组[],还可以是{},可根据实际情况处理。从后面的[object1], [objectN]我们可以知道,extend是可以将多个待处理对象合并成一个目标类型的对象。
推荐教程:《JS教程》
立即学习“Java免费学习笔记(深入)”;
以上就是解决JavaScript中数组排序sort不发生改变的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2728019.html