【问题标题】:how to create associative array in javascript如何在javascript中创建关联数组
【发布时间】:2017-08-02 15:00:11
【问题描述】:

我是一个学习 js 和 node.js 的绝对初学者,我正在构建一个简单的爬虫。该代码正在抓取多个域。我想为抓取到哈希表中的每个域存储诸如标题、描述等元标记等信息,但我不知道如何进行。你能简单解释一下怎么做吗?这里有代码

var request = require('request');
var cheerio = require('cheerio');
var URL = require('url-parse');
var arr = ["http://allrecipes.com/", "http://www.gossip.fr/" ];
console.log("Visiting pages now... ");
for (var i = 0; i < arr.length; i++) {

   setTimeout(request, 5000 * i, arr[i], function (error, response, body) {
         if(error) {
           console.log("Error: " + error);
   }
           console.log("Status code: " + response.statusCode);
         if(response.statusCode === 200) {
            var $ = cheerio.load(body);
         console.log("Page title:  " + $('title').text());
  }
});
}

我修改了代码,如下所示,但不是将每个域的标题存储到散列中,而是仅存储数组的最后一个域的结果。见下面的代码

    var request = require('request');
    var cheerio = require('cheerio');
    var URL = require('url-parse');
    var output = {};
    var arr = ["http://allrecipes.com/", "http://www.gossip.fr/",                "http://www.clicrbs.com.br/rs/" ];
    console.log("Visiting pages now... ");
    for (var i = 0; i < arr.length; i++) {
    var result = arr[i];

    setTimeout(request, 5000 * i, arr[i], function (error, response, body) {
      if(error) {
      console.log("Error: " + error);
                }
      console.log("Status code: " + response.statusCode);
      if(response.statusCode === 200) {
      var $ = cheerio.load(body);
      console.log("Page title:  " + $('title').text());
                                       }
      {
    output[result] = {error: error, title: $('title').text(), status:      response.statusCode} 

  }
});
}

【问题讨论】:

  • JavaScript 没有关联数组。你指的是EcmaScript 6 Map吗?
  • 专业提示:使用 let 代替 var。这可以让您免于日后的意外!

标签: javascript hashtable associative-array


【解决方案1】:

使用let 代替var。这样您就可以在每次迭代中创建一个新的 let 变量,而不是覆盖旧的 var

正确:

let output = {}
let a = ['a', 'b', 'c']
for(let i=0; i<a.length; i++) {
    let result = a[i]; setTimeout(x => output[result] = i, i*5)
}

setTimeout(() => document.write(JSON.stringify(output)), 20)

不正确:

let output = {}
let a = ['a', 'b', 'c']
for(let i=0; i<a.length; i++) {
    var result = a[i]; setTimeout(x => output[result] = i, i*5)
}

setTimeout(() => document.write(JSON.stringify(output)), 20)

您可以在 Mozilla 开发者网络上阅读有关 letlexicographic scoping 的更多信息。

【讨论】:

  • 感谢 Bjartur,非常感谢。我不知道“让”。它解决了问题
  • 是的,但我现在正在处理代码,因为我遇到了一些其他问题,导致哈希的最终结果是错误的。 { 'allrecipes.com': { 域:'所有食谱 |食物、朋友和食谱灵感'}, 'gossip.fr': { 域:'Gossip - Retrouvez toutes les actualités people, news et potins sur les stars et célébrités, ainsi que les derniers buzz du net et infos sur la télé réalité ' },
猜你喜欢
  • 2011-03-17
  • 2020-01-26
  • 2012-03-21
  • 2016-11-15
  • 2015-02-14
  • 2016-09-27
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多