我有一个巨大的csv,我正在尝试根据用户输入进行过滤。它看起来像这样:
from,phone_number,from_date
Seattle,123,6/15/15
Omaha,321,6/14/15
我有一个函数应该接受用户输入,然后只匹配符合该条件的行。
var lst = []
var lst2 = []
var lst3 = []
function mapper() {
var dateu = document.getElementById("userInputdate").value;
var cityu = document.getElementById("userInputcity").value;
var numberu = document.getElementById("userInputnumber").value;
d3.csv("some.csv", function(d) {
return {
city: d.from,
number: d.phone_number,
date: d.from_date
};
}, function(error, rows) {
for (var i = 0; i < rows.length; i++) {
lst.push(rows);
if (dateu.length > 0) {
for (var i = 0; i < lst.length; i++) {
if (lst[i].date === dateu) {
lst.push(rows[i]);
console.log(rows[i]);
}
}
if (cityu.length > 0) {
for (var i = 0; i < lst.length; i++) {
if (lst[i].city === cityu) {
lst2.push(lst[i]);
console.log(lst2);
}
}
if (numberu.length > 0) {
for (var i = 0; i < lst2.length; i++) {
if (lst[i].number === numberu) {
lst3.push(lst2[i]);
console.log(lst3);
}
}
}
}
}
}})};
匹配和传递工作,但问题是用户不一定要输入所有字段。例如,他们可能只将数据输入“city_u”变量,不幸的是,城市匹配(第二个if语句)当前依赖于前一个if语句中的数组。
我正在寻找一种好方法,让每个if语句成为它可以接收的最过滤的数据版本。因此,无论先前的语句是否具有,第二个和第三个if语句都将运行。
哦,我几乎忘了提,我还需要能够将这个最终数组写入csv。重要的是,这不会立即在线托管。 csv应该只写入文件所在的文件夹。
答案 0 :(得分:1)
我可以看到你想根据这三个变量进行过滤,也许这个功能可以帮助你
function apply_filters(data, dateu,cityu,numberu){
if(dateu) {
data = data.filter(function(item){return item.date == dateu;});
};
if(cityu){
data = data.filter(function(item){return item.city == cityu;});
}
if(numberu){
data = data.filter(function(item){return item.number == numberu;});
}
return data;
}
因此您需要将数据数组传递给它,将三个过滤器作为参数传递 您可以在此处阅读过滤器功能:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
答案 1 :(得分:0)
这是另一种方法,它包括数据解析器。我不喜欢在数据中硬编码属性名称的方式,它们应该根据解析器找到的内容传入或存储:
var data = 'from,phone_number,from_date' +
'\nSeattle,123,7/14/15' +
'\nSeattle,456,7/15/15' +
'\nSeattle,789,7/15/15' +
'\nOmaha,456,6/14/15';
// Parse data, using first row as field names
function parseData(data) {
data = data.split('\n');
var labels = data.shift().split(',');
return data.map(function(record) {
var obj = {};
var b = record.split(',');
labels.forEach(function(label,i){obj[label] = b[i] || ''});
return obj;
});
}
// Filter data based on provided values for
function apply_filters(data, dateu, cityu, numberu){
// Return undefined if no criteria provided
if (!data || (!dateu && !cityu && !numberu)) return;
// Arguments are in different order to csv data
var props = ['from_date','from','phone_number'],
args = Array.prototype.slice.call(arguments);
args.shift();
// Filter data on supplied arguments
return data.filter(function(rec){
return args.every(function(arg, i){
return !arg || arg == rec[props[i]];
});
});
}
console.log( JSON.stringify(apply_filters(parseData(data),null,null,'456')) );
它可以减少到更少的代码,但可读性受到影响。如果没有提供参数,则返回 undefined ,但可以轻松返回 data 的副本。