循环和破坏

时间:2018-12-08 11:47:37

标签: javascript destructuring for-of-loop

有人可以向我解释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()方法是如何工作的?我一直在网上浏览并无法真正理解它。

3 个答案:

答案 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();

keynumbers.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

相关问题