Mảng JavaScript cần đặt


144

MSDN tham chiếu JavaScript của Set trừu tượng bộ sưu tập. Tôi đã có một loạt các đối tượng mà tôi muốn chuyển đổi thành một tập hợp để tôi có thể loại bỏ ( .delete()) các thành phần khác nhau theo tên:

var array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

Làm cách nào để chuyển đổi mảng này thành một tập hợp? Cụ thể hơn, có thể làm điều này mà không lặp lại các mảng trên? Tài liệu tương đối thiếu (đủ cho các bộ khởi tạo; không dành cho chuyển đổi - nếu có thể).

Tôi cũng có thể nghĩ đến việc chuyển đổi thành Bản đồ , để xóa bằng khóa. Những gì tôi đang cố gắng thực hiện là một bộ sưu tập có thể lặp lại có thể được truy cập hoặc sửa đổi thông qua việc truy cập các phần tử chủ yếu thông qua một khóa (trái ngược với chỉ mục).

Chuyển đổi từ mảng này sang mảng khác là mục tiêu cuối cùng.


1
nghe có vẻ như một vật thể cũ đơn giản sẽ làm việc cho bạn ...
dandavis

3
@Thomas: vì vậy tôi đang thiếu một cái gì đó, mà tôi muốn tìm hiểu. Sự khác biệt giữa var s = new Set (), thêm đối tượng và phát hành s.delete (sao cũng được) - và var o = {1: 'aaa', 2: 'bbbb' ...} và ban hành xóa (o [ '1'])?
Veverke 10/03/2015

1
@Veverke đó là mô tả nhiều hơn bình luận ban đầu của bạn (+1). Cảm ơn bạn. Nhưng, một lần nữa, có thể làm điều đó mà không lặp lại mảng để thêm nội dung của mảng vào đối tượng và giữ lại một danh sách như, cấu trúc có thể truy cập bằng khóa không? Âm thanh như bạn đã có một ý tưởng. Tôi sẽ không thấy nó ở dạng câu trả lời nếu bạn có thời gian để giải thích.
Thomas

2
Đối tượng mảng đó không hợp pháp, vì {"bob", "dole"}không phải là đối tượng hợp lệ.
Alnitak

1
@Veverke ES6 SetMaplà triển khai "thuần túy" của các cấu trúc dữ liệu đó mà không phải chịu các vấn đề Objectcó thể xảy ra khi mọi thứ được thêm vào nguyên mẫu của nó.
Alnitak

Câu trả lời:


203

Chỉ cần truyền mảng cho hàm tạo Set. Trình xây dựng Set chấp nhận một iterabletham số. Đối tượng Array thực hiện iterablegiao thức, vì vậy nó là một tham số hợp lệ.

var arr = [55, 44, 65];
var set = new Set(arr);
console.log(set.size === arr.length);
console.log(set.has(65));

Xem tại đây


hoàn toàn chính xác, mặc dù tôi đã do dự để tự trả lời vì dữ liệu của OP không đúng định dạng và do đó không rõ chính xác những gì anh ấy mong đợi
Alnitak

10
Điều này không hoạt động trên IE11. Nó không hỗ trợ nhà xây dựng này. Tôi sẽ tránh nó trừ khi bạn biết người dùng nào sẽ sử dụng trình duyệt nào.
Eric

10

Nếu bạn bắt đầu với:

let array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

Và bạn muốn có một bộ, nói, tên, bạn sẽ làm:

let namesSet = new Set(array.map(item => item.name));

3

Những gì levi nói về việc chuyển nó vào hàm tạo là đúng, nhưng bạn cũng có thể sử dụng một đối tượng.

Tôi nghĩ điều mà Veverke đang cố gắng nói là bạn có thể dễ dàng sử dụng deletetừ khóa trên một đối tượng để đạt được hiệu quả tương tự.

Tôi nghĩ rằng bạn bị nhầm lẫn bởi thuật ngữ; các thuộc tính là các thành phần của đối tượng mà bạn có thể sử dụng như các chỉ mục được đặt tên (nếu bạn muốn nghĩ về nó theo cách đó).

Hãy thử một cái gì đó như thế này:

var obj = {
    "bob": "dole",
    "mr.": "peabody",
    "darkwing": "duck"
};

Sau đó, bạn có thể làm điều này:

delete obj["bob"];

Cấu trúc của đối tượng sau đó sẽ là:

{
    "mr.": "peabody",
    "darkwing": "duck"
}

Mà có tác dụng tương tự.


1
Cảm ơn Astro :-). Thật vậy, điều này đã mở ra câu hỏi: "sự khác biệt giữa đối tượng Set và đối tượng đơn giản" là gì? Mặc dù, như tôi đã lưu ý trong các ý kiến ​​trên, "Set" là loại kết thúc cung cấp "chức năng tốt đẹp" của "rõ ràng".
Veverke 10/03/2015

Nói tóm lại, tôi nghĩ tiêu đề của bài đăng nên được đổi thành "Sự khác biệt giữa đối tượng Set và đối tượng đơn giản trong javascript" và lưu ý rằng "Khi cố gắng đạt được điều này và ... cuối cùng tôi đã tự hỏi mình sự khác biệt giữa ...
Veverke 10/03/2015

@Veverke "sự khác biệt giữa đối tượng Đặt và đối tượng đơn giản" là gì, chỉ có thể đọc tài liệu ..
Hqueto

1
@Hqueto: bạn có tìm thấy cái nào khác ngoài Set cung cấp "Clear" trong api của nó không?
Veverke 10/03/2015

1
Đây là một câu trả lời thú vị - nghĩ rằng nó đảm bảo tín dụng nhiều hơn nó đã nhận được. Làm tôi suy nghĩ. Cảm ơn bạn!
Thomas

2

Theo định nghĩa "Tập hợp là tập hợp các giá trị, trong đó mỗi giá trị chỉ có thể xảy ra một lần." Vì vậy, nếu mảng của bạn có các giá trị lặp lại thì chỉ một giá trị trong số các giá trị được lặp lại sẽ được thêm vào Tập hợp của bạn.

var arr = [1, 2, 3];
var set = new Set(arr);
console.log(set); // {1,2,3}


var arr = [1, 2, 1];
var set = new Set(arr);
console.log(set); // {1,2}

Vì vậy, không chuyển đổi thành thiết lập nếu bạn có các giá trị lặp lại trong mảng của mình.

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.