โปรดดูคำตอบนิลส์ใช้Object.entries
และ / หรือคำตอบ bergi โดยใช้ฟังก์ชั่นเครื่องกำเนิดไฟฟ้า แม้ว่าจะObject.entries
ยังไม่อยู่ในข้อกำหนดเมื่อถามคำถาม แต่ก็อยู่ในขั้นตอนที่ 4ดังนั้นจึงปลอดภัยที่จะเติม polyfill และใช้งานได้ในเดือนเมษายน 2559 (เพียง) (เพิ่มเติมเกี่ยวกับขั้นตอนที่นี่ ) และฟังก์ชันเครื่องกำเนิดไฟฟ้าอยู่ใน ES2015 สหกรณ์ถามเฉพาะเพื่อหลีกเลี่ยงตัวกลางและในขณะที่เครื่องกำเนิดไฟฟ้าไม่สมบูรณ์หลีกเลี่ยงที่จะได้งานที่ดีกว่าด้านล่างหรือ Object.enties
(เล็กน้อย)
FWIW โดยใช้Object.entries
:
- สร้างอาร์เรย์
[name, value]
อาร์เรย์ที่จะส่งผ่านไปnew Map
- ตัว
Map
สร้างเรียกใช้ฟังก์ชันบนอาร์เรย์เพื่อรับตัวทำซ้ำ อาร์เรย์สร้างและส่งคืนอ็อบเจ็กต์จำนวนเต็มอาร์เรย์
- ตัว
Map
สร้างใช้ออบเจ็กต์ตัววนซ้ำเพื่อรับรายการ ( [name, value]
อาร์เรย์) และสร้างแผนที่
การใช้เครื่องกำเนิดไฟฟ้า:
- สร้างวัตถุเครื่องกำเนิดไฟฟ้าอันเป็นผลมาจากการเรียกฟังก์ชันเครื่องกำเนิดไฟฟ้า
- คอน
Map
สตรัคเตอร์เรียกใช้ฟังก์ชันบนอ็อบเจ็กต์ตัวสร้างเพื่อรับตัวทำซ้ำจากมัน วัตถุกำเนิดจะส่งคืนตัวเอง
- ตัว
Map
สร้างใช้วัตถุตัวสร้าง (เป็นตัววนซ้ำ) เพื่อรับรายการ ( [name, value]
อาร์เรย์) และสร้างแผนที่
ดังนั้น: ตัวกลางน้อยกว่าหนึ่งตัว (อาร์เรย์จากObject.entries
)
อย่างไรก็ตามการใช้งานObject.entries
นั้นง่ายกว่าและการสร้างอาร์เรย์นั้นไม่ใช่ปัญหา 99.999% ของเวลา อย่างใดอย่างหนึ่ง แต่ทั้งคู่ดีกว่าด้านล่าง :-)
คำตอบเดิม:
ในการเริ่มต้น a Map
คุณสามารถใช้ตัววนซ้ำใด ๆ ที่ส่งคืนคู่คีย์ / ค่าเป็นอาร์เรย์เช่นอาร์เรย์อาร์เรย์:
const map = new Map([
['foo', 'bar']
]);
ไม่มีการแปลงในตัวจากวัตถุเป็นแผนที่ แต่ทำได้อย่างง่ายดายด้วยObject.keys
:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
แน่นอนคุณสามารถให้หน้าที่คนงานจัดการกับตัวเองได้:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
แล้วก็
const map = buildMap({foo: 'bar'});
หรือนี่คือเวอร์ชัน l33t ที่ดูดีกว่า (นั่นยังเป็นของอยู่หรือเปล่า):
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(ใช่Map#set
ผลตอบแทนอ้างอิงแผนที่. บางคนจะเถียงนี้เป็นabusageของreduce
.)
หรือเราสามารถจริงๆไปมากกว่าที่บนความสับสน:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
ไม่ฉันจะไม่ทำอย่างนั้นจริง :-)
Object.entries
เป็นแนวทางที่ดีกว่าจริงๆObject.keys
และวิธีการทำงานของเครื่องกำเนิดไฟฟ้าของ bergi นั้นตรงกว่าObject.keys
หรือObject.entries
.