高效的CSV行减少JS

时间:2015-07-23 23:36:48

标签: javascript csv

我有一个巨大的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应该只写入文件所在的文件夹。

2 个答案:

答案 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 的副本。