我是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语句都依赖于前一个回调中的数组。
答案 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)dateu
和cityu
存在。
3)dateu
,cityu
和numberu
存在。
所以你不关心 dateu
和numberu
存在的情况,但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
希望这更接近你的预期逻辑!