1

私がやろうとしているのは、動的プロパティを使用してオンザフライでオブジェクト リテラルを作成することです。

ファイルのコンテンツ (CSV 形式) を含む配列があります。

各要素は 1 行です (内容は で分割されてい/\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 オブジェクトのパラメーターとして設定し、他の行の値を .csv に入力するにはどうすればよいですか?

  • これで新しい行を解析しても安全ですか : /\r?\n/?

よろしくお願いいたします。

編集:JSONという用語を誤ってオブジェクトリテラルを意味するために使用したため、質問を修正しました。ただし、誤ってコードにエラーを追加しないように、関数を変更しませんでした。

4

3 に答える 3

3

これが私の 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/ですか?

私はイエスと思う。

于 2012-08-02T23:16:05.367 に答える
3

オブジェクトの配列が必要なようです。各オブジェクトには最初の行(ヘッダー)のキーがあります。

次のコードは、csv を既に各行に分割していることを前提としています。\r?\n

(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"}]
于 2012-08-02T23:11:02.527 に答える
1

次のように言うだけでよいと思いますが、どう<somevalue>すればよいかわかりません。

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

いずれにせよ、次のことを考慮してください。

var anObj = {};

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

これは

var anObj = { a1 : "sam", a2 : 5 };
于 2012-08-02T23:10:54.380 に答える