处理JS函数排序的有效方法

时间:2015-07-23 04:26:07

标签: javascript

我是JS的新手,我仍然有点困惑,因为JS函数的排序和嵌套。我有一个脚本,我希望以特定的方式发生。问题可以由用户留空。我试图说,如果变量长度大于零运行回调,但然后进入下两个if语句下发生的代码。我知道必须有一个更有效的方法,但对于我的生活,除了将所有其他代码放在每个不同的if / else语句之外,我无法想到一个。

var lst = []
var lst2 = []
var lst3 = []

alert(cityu);
alert(dateu);
alert(numberu);

d3.csv("kyle.csv", function (d) {
    return {
        city: d.from,
        number: d.phone_number,
        date: d.from_date
    };
}, function (error, rows) {
    if (dateu.length > 0) {
        for (var i = 0; i < rows.length; i++) {
            if (rows[i].date === dateu) {
                lst.push(rows[i]);
                console.log(rows[i]);
            }
        }
    } else {
        if (cityu.length > 0) {
            for (var i = 0; i < lst.city.length; i++) {
                if (lst.city[i] === cityu) {
                    lst2.push(lst[i]);
                    console.log(lst2);
                }
            }
        } else {
            if (numberu.length > 0) {
                for (var i = 0; i < rows.length; i++) {
                    if (lst.number[i] === numberu) {
                        lst3.push(lst2[i]);
                        console.log(lst3);
                    }
                }
            }
        }
    }
})
};

在这里你可以看到,如果dateu变量的长度大于零,那么匹配该用户输入条件的csv中的行将被推送到数组&#34; lst&#34;。显然它目前还没有进入下一个回调,它只会在&#34; dateu&#34;等于零。

我的脚本的另一个问题是,在每个if语句中,我希望根据用户输入的参数减少原始输入。例如,用户可能会输入&#34;西雅图&#34;变量&#34; city&#34;现在将等于西雅图,只有包含西雅图的行作为他们的城市将被保存在行[i]被推到的数组中。

此处显示的每条用户输入:

alert(cityu);
alert(dateu);
alert(numberu);

会对数据集产生相同的影响,每次都会减少所包含的行数。

具体问题是每个if语句都依赖于前一个回调中的数组。

2 个答案:

答案 0 :(得分:0)

您的代码重做了一点 - 我已经删除了else块,因为您想要执行每个循环,而不管之前的循环

if(condition1) {
    do something
}
else {
    do something else
}

从那里,如果满足第一个条件,则else块不会被执行

if(condition1) {
    do something
}
if(condition2) {
    do something else
}

在这种情况下,do something else仅依赖于条件2为真,consition1无关紧要

    var lst = []
    var lst2 = []
    var lst3 = []

    alert(cityu);
    alert(dateu);
    alert(numberu);

    d3.csv("kyle.csv", function(d) {
        return {
            city: d.from,
            number: d.phone_number,
            date: d.from_date
        };
    }, function(error, rows) {
        var i;
        if (dateu.length > 0) {
            for (i = 0; i < rows.length; i++) {
                if (rows[i].date === dateu) {
                    lst.push(rows[i]);
                    console.log(rows[i]);
                }
            }
        }
        if (cityu.length > 0) {
            for (i = 0; i < lst.city.length; i++) {
                if (lst.city[i] === cityu) {
                    lst2.push(lst[i]);
                    console.log(lst2);
                }
            }
        }
        if (numberu.length > 0) {
            for (i = 0; i < rows.length; i++) {
                if (lst.number[i] === numberu) {
                    lst3.push(lst2[i]);
                    console.log(lst3);
                }
            }
        }
    });
};

一个小小的无关紧要的变化,将var i的声明移到了功能块的顶部,因为从技术上讲你已经宣告了三次,并且jslint / jshint会抱怨 - 尽管没有什么会破坏(还)

答案 1 :(得分:0)

我仍然不完全确定你的逻辑,但看看Tiny Giant的要点,似乎只有三种组合:

1)仅存在dateu

2)dateucityu存在。

3)dateucityunumberu存在。

所以你不关心dateunumberu存在的情况,但cityu是空的,对吧?

好的,我重读了你的代码。看起来你有行,你有三个可能的过滤器。根据{{​​1}}过滤行,例如AND

如果是这样,这是一个巨大的重构。就像一个注释,可能有一些JavaScript错误,因为我无法测试这个。但代码相当简单明了:

cityu AND dateu

如果您使用var lst = [] // I'm not using these. var lst2 = [] var lst3 = [] alert(cityu); alert(dateu); alert(numberu); var getActiveFilters = function() { // Edit possibleFilters as necessary. // the key should reflect the header of the column // and the value is a variable referring to the user-inputted string var possibleFilters = { 'date': dateu, 'city': cityu, 'number': numberu }; var activeFilters = {}; for (key in possibleFilters) { if (possibleFilters[key].length > 0) { activeFilters[key] = possibleFilters[key]; } } return activeFilters; } // just made this into a function to get it out of the callback var functionAfterCsv = function(rows) { var activeFilters = getActiveFilters(); var filteredList = []; var addRow = false; for(i = 0; i < rows.length; i++) { // see if the current row matches all the filters present for (key in activeFilters) { if (rows[i][key] === activeFilters[key]) { addRow = true; } else { addRow = false; // if the row doesn't meet one of the conditions, // there's no need to check the rest break; } } if (addRow) { filteredList.push(row[i]); } } return filteredList; }; d3.csv("kyle.csv", function (d) { return { city: d.from, number: d.phone_number, date: d.from_date }; }, function (error, rows) { functionAfterCsv(rows); }) }); 进行过滤,那么您需要将比较更改为以下内容:

OR

希望这更接近你的预期逻辑!