【问题标题】:Create object on the fly from CSV从 CSV 动态创建对象
【发布时间】:2012-08-02 22:55:59
【问题描述】:

我想要做的是动态创建一个具有动态属性的对象字面量。

我有一个包含文件内容(CSV 格式)的数组。

每个元素都是一行(内容用/\r?\n/分割)。

该数组的第一个元素(第一行)包含我想为我的对象字面量设置的参数,用逗号分隔。

所有其他元素都是第一行中设置的参数的值(仍然是 CSV 格式)。

我目前的代码如下:

function jsonDataArray(array) {
    var jsonResult = [],
        parameters = [],
        values;
    for(var i=0; i < array.length; i++) {
        if(i === 0) {
            var parameters = array[i].split(',');
            var objJSON = {};
            for(var k=0; k < parameters.length; k++) {
                objJSON.eval(parameters[k]);
            }
            continue;
        }
        values = array[i].split(',')
        for(var j=0; j < objJSON.length; j++) {
            objJSON[j] = values;
        }
        jsonResult.push(objJSON);
    }
    return jsonResult;
}

现在,当我在节点中启动此代码时,objJSON.eval(parameters[k]) 行似乎是问题所在,但我无法解决问题。

所以基本上我的问题如下:

  • 我应该如何继续将第一行中的参数设置为 JSON 对象的参数 + 填充其他行的值?

  • 用 /\r?\n/ 解析新行是否安全?

提前感谢您的帮助!

编辑:我错误地使用术语 JSON 来表示对象文字,所以我更正了这个问题。虽然我没有修改函数,所以我不会错误地在代码中添加错误。

【问题讨论】:

  • 不是JSON,它只是一个javascript对象
  • 对不起,我误解了这个词。我编辑了我的问题。
  • JSON 是一个表示 javascript 对象的字符串。你到底想用这条线完成什么? objJSON.eval(parameters[k]);
  • 我正在尝试为对象“objJSON”创建一个属性。这个属性应该像数组参数中元素 k 的值一样命名。

标签: javascript node.js csv


【解决方案1】:

在我看来你想要一个对象数组,每个对象都有第一行的键(标题)。

以下代码假设您已经通过 \r?\n 将 csv 分解为每一行

(function() {
  var csv = [];
      csv.push('name,age,gender');
      csv.push('jake,13,m');
      csv.push('sarah,15,f');
      csv.push('john,18,m');
      csv.push('nick,13,m');

  console.log(csv);

  function jsonDataArray(array) {
    var headers = array[0].split(',');
    var jsonData = [];
    for ( var i = 1, length = array.length; i < length; i++ )
    {
      var row = array[i].split(',');
      var data = {};
      for ( var x = 0; x < row.length; x++ )
      {
        data[headers[x]] = row[x];
      }
      jsonData.push(data);

    }

    return jsonData;
  }

  console.log(jsonDataArray(csv));


})();

http://jsbin.com/igiwor/2/edit

这将产生如下内容:

[{ name="jake",  age="13",  gender="m"},
{ name="sarah",  age="15",  gender="f"}, 
{ name="john",  age="18",  gender="m"},
{ name="nick"  age="13",  gender="m"}]

【讨论】:

  • 非常感谢您提供此代码!我认为它使用了霍根试图向我解释的东西。再次感谢您的快速回答!
【解决方案2】:

这是我的 CSV 解析函数,希望对您有所帮助:

function parseCSV(input) {
    var rows = input.split(/\r?\n/);
    var keys = rows.shift().split(",");
    return rows.map(function(row) {
        return row.split(",").reduce(function(map, val, i) {
            map[keys[i]] = val;
            return map;
        }, {});
    });
}

我应该如何继续将第一行中的参数设置为 JSON 对象的参数 + 填充其他行的值?

只需循环遍历这些值。那么,values[i] 添加到object 的键是parameters[i]。在我的版本中是map[keys[i]] = val;

用 /\r?\n/ 解析新行是否安全?

我认为是的。

【讨论】:

  • 感谢您的回答!特别是关于 /\r?\n/ 拆分的安全性。您的 CSV 解析功能类似于 travis 提出的功能,因此也感谢您。
  • 是一样的,只是用 map & reduce 写的更短 :-)
【解决方案3】:

我想你可以只说以下内容,但我不确定&lt;somevalue&gt; 应该是什么。

      objJSON[parameters[k]] = <somevalue>;

无论如何,请考虑以下事项,

var anObj = {};

anObj["a1"] = "sam";
anObj["a2"] = 5;

这个和

一样
var anObj = { a1 : "sam", a2 : 5 };

【讨论】:

  • 我会尝试直接做objJSON[parameters[k]]
猜你喜欢
  • 2016-10-02
  • 1970-01-01
  • 2014-03-14
  • 2017-05-04
  • 2014-06-03
  • 2019-06-19
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
相关资源
最近更新 更多