Array.sort() trong javascript và cách javascript biên dịch

chào các bạn, mình đang có thắc mắc về sort trong js.
Ở đây mình có tạo một mảng gồm có các đối tượng với các thuộc tính tên,giá,số lương.
Mình sắp xếp chúng như trong đoạn code dưới đây.

var kho=[
  {name:"waterngot",price:9000,soluong:6},
  {name:"bút",price:5000,soluong:8},
  {name:"thước",price:6000,soluong:10}
];
// sắp xếp price từ thấp đến cao
var sort_price=kho.sort(function(a,b){
    return a.price-b.price;
});

// sắp xếp giá trị sản phẩm còn ở trong kho. 
var gia_tri=kho.sort(function(a,b){
  return a.price*a.soluong-b.price*b.soluong;
});
console.log("sắp xếp theo mặt hàng price từ thấp đến cao:")
console.log(sort_price);
console.log("sắp xếp theo mặt hàng giá trị từ thấp đến cao:")
console.log(gia_tri);

kết quả mình nhận được là:

sắp xếp theo mặt hàng price từ thấp đến cao:
[
  { name: 'bút', price: 5000, soluong: 8 },
  { name: 'waterngot', price: 9000, soluong: 6 },
  { name: 'thước', price: 6000, soluong: 10 }
]
sắp xếp theo mặt hàng giá trị từ thấp đến cao:
[
  { name: 'bút', price: 5000, soluong: 8 },
  { name: 'waterngot', price: 9000, soluong: 6 },
  { name: 'thước', price: 6000, soluong: 10 }
]

mình nhận thấy kết quả phần sắp xếp theo price không chính xác. nhưng khi mình cho nó chạy một mình như thế này:

var kho=[
  {name:"waterngot",price:9000,soluong:6},
  {name:"bút",price:5000,soluong:8},
  {name:"thước",price:6000,soluong:10}
];
// sắp xếp price từ thấp đến cao
var sort_price=kho.sort(function(a,b){
    return a.price-b.price;
});

console.log("sắp xếp theo mặt hàng price từ thấp đến cao:")
console.log(sort_price);

kết quả là:

sắp xếp theo mặt hàng price từ thấp đến cao:
[
  { name: 'bút', price: 5000, soluong: 8 },
  { name: 'thước', price: 6000, soluong: 10 },
  { name: 'waterngot', price: 9000, soluong: 6 }
]

đúng với ý tưởng của mình.
Vậy cho mình hỏi vì sao đoạn code thứ nhất nó lại chạy không đúng với 2 lần sắp xếp như vậy. Nếu là do cách JS biện dịch thì các bạn có thể giải thích qui trình biên dịch của JS cho mình với. code của mình được chạy trên trang repl.it.

Nó là in place sorted, muốn theo ý bạn thì phải copy ra mảng khác rồi mới sort.

3 Likes

Cái này giống kiểu in một con trỏ đây mà :smiley:

4 Likes

Hiểu đơn giản là bạn đang mutate/chỉnh sửa chính mảng kho ban đầu.
Nghĩa là kho = sort_price = gia_tri, tuy là 3 biến nhưng trỏ về cùng 1 địa chỉ.

Giống như khi bạn có a = [], b = a; b.push(1) thì cả a, b đều có giá trị 1 vậy. Tương tự với Object trong JS. Thế nên mới có thuật ngữ deep/shallow copy hay deep/shallow clone

Bạn nên bắt đầu học cách tìm hiểu trên MDN như Shiharoku có đưa link.

5 Likes

oh. bạn đã giúp mình rõ được vấn đề rất nhanh . mình khá kém tiếng anh nên nãy h vẫn đang cố đọc hiểu theo link của Shiharoku để tìm câu trả lời. cảm ơn các bạn

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?