javascript中lodash里sortby之后的object和原object有什么联系?

木瓜~ 2017-05-27 10:07:08
我有下面这个函数,先对输入object进行排序,然后对最小的加true标签,其他的加false标签。
我也是稀里糊涂的就实现了这个功能, 但是实在没有明白为什么。
根据打印,lodash 的sortBy之后的结果和原来的obj是完全不一样的,而我的更改是基于sortby之后的结果,为什么obj也跟着变化了?
希望某位知道原因的大神帮忙解惑下?

function test(obj,key) {
console.log("obj_orig======\n%j", obj);
console.log("obj_sortby=====\n%j", _.sortBy(obj, ['age', 'user']));
console.log("obj_after_sortby=====\n%j", obj);
_.sortBy(obj, ['age', 'user']).forEach(function(d, i) { d[key] = (0===i) ? true : false;});
console.log("after_change====\n%j", obj);
}

var users = [
 { 'user': 'Halen',   'age': 48 },
{ 'user': 'barney', 'age': 36 },
 { 'user': 'fred',   'age': 40 },
 { 'user': 'Jack', 'age': 34 }
];

test(users ,"zzz");

运行结果输出==========================
obj_orig======
[{"user":"Halen","age":48},{"user":"barney","age":36},{"user":"fred","age":40},{"user":"Jack","age":34}]
obj_sortby=====
[{"user":"Jack","age":34},{"user":"barney","age":36},{"user":"fred","age":40},{"user":"Halen","age":48}]
obj_after_sortby=====
[{"user":"Halen","age":48},{"user":"barney","age":36},{"user":"fred","age":40},{"user":"Jack","age":34}]
after_change====
[{"user":"Halen","age":48,"zzz":false},{"user":"barney","age":36,"zzz":false},{"user":"fred","age":40,"zzz":false},{"user":"Jack","age":34,"zzz":true}]
...全文
416 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
木瓜~ 2018-01-24
  • 打赏
  • 举报
回复
@天际的海浪 谢谢你的 答复 经过我仔细的研究,我发现是由于数组嵌套引用类型引起的。 如果这个里没有嵌套对象,那么新排序后的数组和原数组是没有关系的。如下 > oldObj [ 2, 4, 5, 1, 3 ] > var newObj = _.sortBy(oldObj) undefined > newObj [ 1, 2, 3, 4, 5 ] > oldObj == newObj false > oldObj === newObj false 但是,但数组里面嵌套了引用类型,那么sortBy返回的第一层数组还是和原obj不是同一个东西了。 但是sortBy返回的和原obj的第二层是有联系的。比如 changpzh@13:22:~/tmp$ node > const _ = require("lodash"); undefined > var obj = [ ... { 'user': 'Halen', 'age': 48 }, ... { 'user': 'barney', 'age': 36 }, ... { 'user': 'fred', 'age': 40 }, ... { 'user': 'Jack', 'age': 34 } ... ]; undefined > var newObj = _.sortBy(obj, ['age', 'user']) undefined > newObj [ { user: 'Jack', age: 34 }, { user: 'barney', age: 36 }, { user: 'fred', age: 40 }, { user: 'Halen', age: 48 } ] > obj [ { user: 'Halen', age: 48 }, { user: 'barney', age: 36 }, { user: 'fred', age: 40 }, { user: 'Jack', age: 34 } ] > newObj.push("new item") 5 > newObj [ { user: 'Jack', age: 34 }, { user: 'barney', age: 36 }, { user: 'fred', age: 40 }, { user: 'Halen', age: 48 }, 'new item' ] > obj //newObj的第一层改变不会引起obj的跟着变化 [ { user: 'Halen', age: 48 }, { user: 'barney', age: 36 }, { user: 'fred', age: 40 }, { user: 'Jack', age: 34 } ] > =================== 但是第二层的变化,两个都会引起变动。 > newObj.forEach(function(d, i) { d["zhou"] = (0===i) ? true : false;}); undefined > newObj [ { user: 'Jack', age: 34, zhou: true }, { user: 'barney', age: 36, zhou: false }, { user: 'fred', age: 40, zhou: false }, { user: 'Halen', age: 48, zhou: false } ] > obj [ { user: 'Halen', age: 48, zhou: false }, { user: 'barney', age: 36, zhou: false }, { user: 'fred', age: 40, zhou: false }, { user: 'Jack', age: 34, zhou: true } ] > obj[0].zhou = "jason" 'jason' > obj [ { user: 'Halen', age: 48, zhou: 'jason' }, { user: 'barney', age: 36, zhou: false }, { user: 'fred', age: 40, zhou: false }, { user: 'Jack', age: 34, zhou: true } ] > newObj [ { user: 'Jack', age: 34, zhou: true }, { user: 'barney', age: 36, zhou: false }, { user: 'fred', age: 40, zhou: false }, { user: 'Halen', age: 48, zhou: 'jason' } ] > obj === newObj false > obj[0] === newObj[3] true >
木瓜~ 2017-05-27
  • 打赏
  • 举报
回复
是的,sortBy返回的是新数组,我也觉得它和原数组的对象有关系。 但是我用console.log分别打印,sortBy返回的新object,和原object,这两个object是不同的内容了!如何解释他们之间的联系? 这是我非常纳闷的地方! 请看: console.log("obj_sortby=====\n%j", _.sortBy(obj, ['age', 'user'])); obj_sortby===== [{"user":"Jack","age":34},{"user":"barney","age":36},{"user":"fred","age":40},{"user":"Halen","age":48}] console.log("obj_after_sortby=====\n%j", obj); obj_after_sortby===== [{"user":"Halen","age":48},{"user":"barney","age":36},{"user":"fred","age":40},{"user":"Jack","age":34}]
a350062174 2017-05-27
  • 打赏
  • 举报
回复
sortBy 返回一个新数组. 但是新数组里的对象和原数组是相同的对象
天际的海浪 2017-05-27
  • 打赏
  • 举报
回复
对象和数组都是按引用地址赋值传递的,这样两个变量就指向同一个内存地址。一但对象或数组的属性发生改变,会同时影响两个变量 可以用 newObj = JSON.parse(JSON.stringify(obj)) 对对象和数组进行深度克隆

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧