有人可以向我解释map.entries()和销毁工作的确切方式吗?
var numbers = new Map()
numbers.set(1,'one')
numbers.set(2,'two')
numbers.set(3,'three')
numbers.set(4,'four')
var [key,value] = numbers.entries() // returns key as [1,'one'] and value as [2,'two']
//but when using for..of loop
for(let [key,value] of numbers.entries()){
console.log(key,value)
} // it works and console logs keys and values
这为什么在for..loop中起作用?以及.entries()方法是如何工作的?我一直在网上浏览并无法真正理解它。
答案 0 :(得分:2)
01.00.54 PM
方法返回一个迭代器。迭代器产生的每个值都是一个键/值对(包含2个元素的数组)。
掌握这一点的一种方法是查看将迭代器消耗到新数组中会发生什么:
//
// ViewController.swift
// Street Grinders
//
// Created by Jörg Quick on 20.11.18.
// Copyright © 2018 FH Darmstadt. All rights reserved.
//
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
@IBOutlet weak var WebView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
self.WebView.uiDelegate = self
//Lade Webseite https://www.street-grinders.de
let url = URL(string: "https://www.street-grinders.de")
let request = URLRequest(url: url!)
//Lade Webview
WebView.load(request)
//Gestensteuerung aktivieren
WebView.allowsBackForwardNavigationGestures = true
//Lade die Seite neu wenn Push Down
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(reloadWebView(_:)), for: .valueChanged)
WebView.scrollView.addSubview(refreshControl)
}
//Öffnet Safari, wenn neuer Tab beansprucht wird!
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if navigationAction.targetFrame == nil {
UIApplication.shared.open(navigationAction.request.url!, options: [:])
}
return nil
}
//Gibt Speicherwarnung
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//Funktion zum Seite neu laden!
@objc func reloadWebView(_ sender: UIRefreshControl) {
WebView.reload()
sender.endRefreshing()
}
}
请注意,您将一系列键/值对放入一个新数组:
entries
现在输入您的代码。对var numbers = new Map().set(1,'one').set(2,'two').set(3,'three').set(4,'four');
// Get everything from the iterator into a new array:
var arr = Array.from(numbers.entries());
console.log(arr);
和[ [1, "one"], [2, "two"], [3, "three"], [4, "four"] ]
的第一次分配具有误导性,因为您没有得到一个键和一个值。相反,您要抓住key
迭代器产生的前两对。
如果您真的想获得带有两个变量中相应值的 first 键,则需要编写:
value
答案 1 :(得分:1)
您的第一次分配更容易理解:
socketIo.on('connection',async(socket) => {
socket.handshake.session.save((err)=> {if(err)return err;});
socketIo.emit('site online', Object.keys(socketIo.sockets.sockets).length)
await UserController(<any>socket)
})
socket.on('disconnect', () => {
socketIo.emit('site online', Object.keys(socketIo.sockets.sockets).length)
})
以上代码段解构了键,值对(组)。
另一方面,您的for循环枚举map并逐一获取每个设置项。
当您放置var [set1, set2, set3, set4] = numbers.entries();
时,实际上是在破坏集合本身。
结果,您的for循环在设置项上进行迭代,然后对每个设置项使用解构来分配键和值
答案 2 :(得分:1)
在第一种情况下,numbers.entries()
代表一个数组,其中包含地图中的每个条目。
var [key,value] = numbers.entries();
key
是numbers.entries()
数组中第一个索引(0)的元素,value
是第二个元素,如果您拥有第三个解构属性,例如elem
,它将代表[3, 'three']
,依此类推。
在第二种情况下,您正在遍历numbers.entries()
数组,因此在每个循环中,您只会在该数组中获得单个元素。
for (let [key, value] of numbers.entries())
让我们简化一下:
for (let singleElement of numbers.entries())
因此,在每个循环中,singleElement
代表numbers.entries()
中的每个嵌套数组。
因此,第一个周期将是[1, 'one']
,在解构后将被评估为key
的{{1}}和1
的{{1}},依此类推。>
value
如果您想了解有关one
的更多信息,请考虑查看:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map