3d数组覆盖其他维度JS的值

时间:2014-07-01 17:33:23

标签: javascript jquery arrays node.js multidimensional-array

我似乎无法弄清楚我在昨天写的这段代码上做错了什么。这是我第一次掀起JavaScript,并且第一次使用jQuery和Node.js,我认为这个三维数组应该按原样运行。我已经看到混淆提到多维数组是什么,人们说JavaScript没有任何数据,尽管它有数组数组。无论如何,我想我在技术上使用数组的数组,并且不明白为什么我的外部数组(我想象的是设计的外部维度)覆盖了来自两个内部的元素 - 数组成为自己的元素。两个内部数组看起来像它们应该的那样工作,但是最外层的数组以某种我不太了解的方式混合了数据。

通过滚动此代码生成的output.json文件可以观察到不一致/问题,并且看到输出显然与此网页上的三个表中的每一个都不匹配我从中抓取:

// My server.js file:
var express = require('express');
var fs      = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var app         = express();

// the link below is a tutorial I was loosely following
// see http://scotch.io/tutorials/javascript/scraping-the-web-with-node-js
app.get('/scrape', function(req, res) {

    url = 'http://espn.go.com/nba/player/stats/_/id/4145/kareem-abdul-jabbar'

    request(url, function(error, response, html) {

        if(!error) {

            // utilize the Cheerio library on the returned html, yielding jQuery functionality
            var $ = cheerio.load(html);

            var numOfRows;

            var stats = [[[]]];

            for(var chart = 0; chart < 3; chart++) {

                stats.push([[]]);   // allocates space for each grid on each chart (each set of rows and columns)

                $('.tablehead').eq(chart).filter(function(){
                    var data = $(this);
                    numOfRows = data.children().length - 2;
                    for(var i = 0; i < numOfRows + 1; i++) {
                        stats[chart].push([]); // allocates space for each row in the chart
                    }
                })

                var numOfColumns;

                $('.stathead').eq(chart).filter(function(){
                    var data = $(this);
                    stats[chart][0][0] = data.children().first().text();
                })

                $('.colhead').eq(chart).filter(function(){  // first() specifies to select the first of the three occurances of this class; use eq(param) to find the Nth occurance
                    var data = $(this);
                    numOfColumns = data.children().length; 
                    for(var i = 0; i < numOfColumns; i++) {
                        stats[chart][1][i] = data.children().eq(i).text();
                    }
                })

                var currentRow = 2;

                for(var oddRow = 0; oddRow < (numOfRows + 1)/2 - 1; oddRow++) {
                    $('.tablehead .oddrow').eq(oddRow).filter(function(){
                        var data = $(this);
                        for(var c = 0; c < numOfColumns; c++) {
                            stats[chart][currentRow][c] = data.children().eq(c).text();
                        }
                        currentRow += 2;
                    })  
                }   

                currentRow = 3;
                for(var evenRow = 0; evenRow < (numOfRows + 1)/2 - 1; evenRow++){
                    $('.tablehead .evenrow').eq(evenRow).filter(function(){
                        var data = $(this);
                        for(var c = 0; c < numOfColumns; c++) {
                            stats[chart][currentRow][c] = data.children().eq(c).text();
                        }
                        currentRow += 2;
                    })  
                }

                currentRow -= 1; // gets the last allocated row index (after "currentRow += 2" has been executed)
                $('.tablehead .total').eq(chart).filter(function(){
                    var data = $(this);
                    var LOGOIDX = 1;
                    for(var c = 0; c < numOfColumns - 1; c++) {
                        if(c < LOGOIDX) {
                            stats[chart][currentRow][c] = data.children().eq(c).text();
                        }
                        if(c == LOGOIDX) {
                            stats[chart][currentRow][c] = "N.A.";
                            stats[chart][currentRow][c + 1] = data.children().eq(c).text();
                            continue;
                        }
                        else {
                            stats[chart][currentRow][c + 1] = data.children().eq(c).text();
                        }
                    }
                })
            }   // end chart loop
        }

    // Want to parse my json so that it displays in format: "name: value" rather than just "name" as it is now...

        fs.writeFile('output.json', JSON.stringify(stats, null, 4), function(err){

            console.log('File successfully written! - Check the project directory for the output.json file');
            console.log('Number of columns in chart is: ' + numOfColumns);
        })

        // message to browser reminding that there's no UI involved here.
        res.send('Check the console!')
    })
})

app.listen('8081')

console.log('Magic happens on port 8081');

exports = module.exports = app;

1 个答案:

答案 0 :(得分:1)

啊哈!抓住我的错误 - 只是一个简单的逻辑错误。有点尴尬我没有早点看到它,但是哦,在一天结束时做了一些练习和研究(以及相当多的分心):

可以看出,我所做的所有HTML类的搜索都是通过一个名为“chart”的变量进行参数化的,除了我在每个图表中搜索奇数行甚至行的地方 - 实际的大部分每个图表,所以它天真地出现了我的“3d数组[是]从其他维度覆盖值”&lt; - lol。

简单来说,我只需要根据每个图表的条件(一些额外的代码行)创建一个偏移量,我需要编辑两行代码来反映新计算的偏移量,如下所示:

$('.tablehead .oddrow').eq(rowOffset + oddRow).filter(function(){

$('.tablehead .evenrow').eq(rowOffset + evenRow).filter(function(){

非常感谢您的帮助!我希望这个问题在很大程度上有益于其他人:P