Nhân bản nông một Bản đồ hoặc Bộ ES6


99

Làm cách nào để bạn nhân bản một cách nông cạn đối tượng Bản đồ hoặc Đặt ES6 ?

Tôi muốn nhận Bản đồ hoặc Tập hợp mới có cùng các khóa và giá trị.

Câu trả lời:


202

Sử dụng hàm tạo để sao chép Bản đồ và Bộ:

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)

3
Làm thế nào để làm một nhân bản sâu?
BILL

3
Kiểm tra trò chơi này để biết cách sao chép sâu bản đồ: jsfiddle.net/pahund/5qtt2Len/1
Patrick Hund

5
Mapnên được coi là một kiểu dữ liệu trừu tượng, không phải là một đối tượng Javascript. Do đó, nhân bản sâu a Mapkhông có ý nghĩa.

5
Thật không may, hàm tạo bản sao không hoạt động trong IE 11 (bản đồ trống được tạo).
Jan Molnar

4

Tạo một Set mới thông qua vòng lặp for nhanh hơn so với phương thức khởi tạo Set. Điều này cũng đúng với Maps, mặc dù ở mức độ thấp hơn.

const timeInLoop = (desc, loopCount, fn) => {
  const d = `${desc}: ${loopCount.toExponential()}`
  console.time(d)
  for (let i = 0; i < loopCount; i++) {
    fn()
  }
  console.timeEnd(d)
}

const set = new Set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

const setFromForLoop = x => {
  const y = new Set()
  for (const item of x) y.add(item)
  return y
}

const map = new Map([['a', 1], ['b', 2], ['c', 3], ['d', 4], ['e', 5]])

const mapFromForLoop = x => {
  const y = new Map()
  for (const entry of x) y.set(...entry)
  return y
}

timeInLoop('new Set(set)', 1e5, () => new Set(set))

timeInLoop('setFromForLoop(set)', 1e5, () => setFromForLoop(set))

timeInLoop('new Map(map)', 1e5, () => new Map(map))

timeInLoop('mapFromForLoop(map)', 1e5, () => mapFromForLoop(map))


Rất vui! Có thể đáng để tạo ra một lỗi trên trình theo dõi lỗi Chromium để thu hút sự chú ý của họ đến nó. Điều này chắc chắn có thể sửa được trong động cơ. Tương tự như vậy đối với Firefox, biểu hiện cùng một vấn đề đối với Set(mặc dù không phải đối với Map).
Jo Liss
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.