2017-11-06 21 views
13

Tôi có một bản đồ js như thế này mộtCách lấy khóa trong Bản đồ JavaScript theo giá trị của nó?

let people = new Map(); 
people.set('1', 'jhon'); 
people.set('2', 'jasmein'); 
people.set('3', 'abdo'); 

những gì tôi muốn là một số phương pháp để trả lại một chìa khóa bởi giá trị của nó

let jhonKey = people.getKey('jhon'); // jhonKey should be '1' 
+13

Sau đó, tại sao bạn lưu trữ nhầm vòng? :-P – Bergi

Trả lời

14

Bạn có thể Kết cho nó trong một mảng với phím mảng/giá trị .

Làm thế nào nó hoạt động

let jhonKey = ([...people].find(([, v]) => v === 'jhon') || [])[0]; 

Parts:

   [...people] 

Nó hoạt động với một mảng, nơi các giá trị được phát ra từ Map dụ bằng spread syntax ... mà gây nên các Map.prototype[@@iterator]() iterator cho kết quả tương tự (vì nó là cùng chức năng) như Map#entries.

   [...people].find(([, v]) => v === 'jhon') 

Đối với việc tìm kiếm một giá trị trong một mảng, Array#find có ích, bởi vì nó sẽ trả về phần tử đầu tiên, trên đó gọi lại trả về giá trị truthy.

       ([, v]) => v === 'jhon' 
           ^^^^^ 

Danh sách tham số của callback chứa một destructuring assignment và chỉ mất phần tử thứ hai của một mảng, bởi vì đó là giá trị cho việc kiểm tra bên trong của hàm.

   ([...people].find(([, v]) => v === 'jhon') || [])[0] 

Nếu một giá trị được tìm thấy, đó là một mảng, hoặc nếu không có yếu tố được tìm thấy, đó là undefined và hạch toán như một giá trị falsy, sau đó một logical OR || được sử dụng như nhà điều hành mặc định để có được một mảng trống rỗng, bởi vì kết quả là nó sẽ trả về phần tử đầu tiên của mảng hoặc undefined, nếu không tìm thấy.

let jhonKey = ([...people].find(([, v]) => v === 'jhon') || [])[0]; 

Cuối cùng, kết quả được chỉ định.

let people = new Map(); 
 
people.set('1', 'jhon'); 
 
people.set('2', 'jasmein'); 
 
people.set('3', 'abdo'); 
 

 
let jhonKey = ([...people].find(([, v]) => v === 'jhon') || [])[0]; 
 

 
console.log(jhonKey);

+0

@Rajesh, thực ra, chúng ta cần chìa khóa chứ không phải chỉ mục. –

+2

Trên thực tế chúng ta cần chìa khóa không phải chỉ mục hoặc giá trị .. :) – Keith

+0

@NinaScholz Tôi tò mò, bạn có thực sự sử dụng loại lót này trong công việc của bạn không và liệu bạn có đang gỡ lỗi mã của mình theo bất kỳ cách nào không? – Engineer

16

Bạn có thể sử dụng for..of vòng lặp để lặp trực tiếp trên map.entries và lấy chìa khóa.

function getByValue(map, searchValue) { 
 
    for (let [key, value] of map.entries()) { 
 
    if (value === searchValue) 
 
     return key; 
 
    } 
 
} 
 

 
let people = new Map(); 
 
people.set('1', 'jhon'); 
 
people.set('2', 'jasmein'); 
 
people.set('3', 'abdo'); 
 

 
console.log(getByValue(people, 'jhon')) 
 
console.log(getByValue(people, 'abdo'))

+4

Một lợi thế của giải pháp này có thể là tốc độ, vì không có biến đổi mảng. Để thực sự có được tinh thần của ES6 mặc dù, có thể là tốt đẹp nếu bạn thay đổi 'var' thành' const' .. – Keith

+0

@Keith Cảm ơn bạn đã chỉ ra nó. Đã cập nhật nó thành 'let'. – Rajesh

+1

Đẹp nhất. chỉ cần một đầu lên 'const' hoạt động ở đây quá trong' cho '. Nó không hoạt động giống như một 'for' bình thường trong lĩnh vực này. – Keith

7

Không có phương pháp trực tiếp để chọn ra các thông tin theo hướng này, vì vậy nếu bạn chỉ có mỗi bản đồ bạn cần phải lặp qua các thiết lập theo đề nghị của người khác.

Nếu bản đồ/mảng/khác đủ lớn để vòng lặp đó là vấn đề hiệu suất và yêu cầu tra cứu ngược lại là phổ biến trong dự án, bạn có thể triển khai cấu trúc của riêng mình bằng cặp bản đồ/mảng/khác với một theo đối tượng hiện tại và một với khóa và giá trị đảo ngược. Bằng cách đó, tra cứu ngược lại hiệu quả như bình thường.Tất nhiên, bạn có nhiều việc phải làm khi bạn cần triển khai từng phương thức mà bạn cần như một thông qua cho một hoặc cả hai đối tượng bên dưới, vì vậy nếu bản đồ nhỏ và/hoặc tra cứu ngược lại không cần thiết thường xuyên quét tùy chọn -via-loop có thể thích hợp hơn do đơn giản hơn để duy trì và có thể đơn giản hơn cho trình biên dịch JiT để tối ưu hóa.

Trong mọi trường hợp, một điều cần thận trọng là khả năng nhiều khóa có thể có cùng giá trị. Nếu điều này là có thể thì khi vòng qua bản đồ của bạn, bạn cần quyết định xem bạn có muốn trả lại một trong các khóa có thể tùy ý (có thể là khóa đầu tiên) hoặc nếu bạn muốn trả về một dãy các khóa, và nếu thực hiện một chỉ số đảo ngược đối với dữ liệu có thể có giá trị trùng lặp thì cùng một vấn đề cũng cần được tính toán.

Các vấn đề liên quan