2016-04-19 6 views
0

私はJavascriptを使い慣れていないので、私が書いた関数に問題があります。私はarray.reduce()を使って仕事をしていますが、Windowsでは失敗しています(Mac上でのテストはうまくいきます)。Node.js - Javascript - ネストされたオブジェクトにファイルを解析する

私が持っているファイルは、このようにフォーマットされています。私は構造を持っていると思い

ford.car.focus.transmission=standard 
ford.car.focus.engine=four-cylinder 
ford.car.focus.fuel=gas 

ford.car.taurus.transmission=automatic 
ford.car.taurus.engine=V-8 
ford.car.taurus.fuel=diesel 

purchased=Ford Taurus 

次のようになります。

{ ford: 
    { car: 
    { focus: 
     { 
     transmission: 'standard', 
     engine: 'four-cylinder', 
     fuel: 'gas' 
     } 
    } 
    { taurus: 
     { 
     transmission: 'automatic', 
     engine: 'V-8', 
     fuel: 'diesel' 
     } 
    } 
    } 
    purchased: 'Ford Taurus' 
} 

私は上の分割、配列内のファイルの行を格納しています'\ n'私はこのように私のグローバルオブジェクトを渡して、ループ内で呼び出されることになるメソッドを記述しようとしている:

var hash = {}; 
var array = fileData.toString().split("\n"); 
for (i in array) { 
    var tmp = array[i].split("="); 
    createNestedObjects(tmp[0], tmp[1], hash); 
} 

私の現在の機能は次のようになります。

function create_nested_object(path, value, obj) { 
    var keys = path.split('.'); 
    keys.reduce(function(o, k) { 
    if (k == keys[keys.length-1]) { 
     return o[k] = value; 
    } else if (o[k]) { 
     return o[k]; 
    } else { 
     return o[k] = {}; 
    } 
    }, obj); 
} 

私はこれをオンにしたいと思いますforループに入れます。

function create_nested_object(path, value, obj) { 
    var keys = path.split('.'); 

    for (var i = 0; i < keys.length; i++) { 
    if (keys[i] == keys[keys.length-1]) { 
     obj[keys[i]] = value; 
    } else if (obj[keys[i]] == keys[i]) { 
     obj; 
    } else { 
     obj = obj[keys[i]] = {}; 
    } 
    } 
} 

しかし、それは唯一の各巣内の最後の項目を返します:

{ 
    "ford": { 
    "car": { 
     "taurus": { 
     "fuel": "diesel" 
     } 
    } 
    }, 
    "purchased": "Ford Taurus" 
} 

私は」知っている私は、この(私はarray.reduce変換()のコードを試してみました)ように見える新しいコードを持っています何か不足していますが、何が間違っているのか分かりません。どんな助けもありがとう! @Martyが示唆されているようにする必要があり、、

var array = fileData.toString().split("\n"); 

そして:

関連質問:OPコードで を:Javascript - Parsing INI file into nested associative array

+1

JSONのような既存の解析メソッドを持つ形式でデータを保存しないのはなぜですか?独自のデータ形式を作成する必要はありません。いずれにせよ、それはあなたが分割している行の終わりとは何かを持っている可能性があります。別のOSでは違っています(私はそのようなものの専門家とは遠く離れています)。 – Marty

+0

@Martyは正しいです。ウィンドウでは、 "\ r \ n"を使用する必要があります。 –

+0

レガシーアプリケーションにフックするので、このファイル形式を使用する必要があります。 – jbmoon

答えて

0

EDITはコメントでos.EOL

ソリューションを使用するには:

var array = fileData.toString().split(os.EOL); 

Windowsの場合。

+1

ノードの['EOL'](https://nodejs.org/api/os.html#os_os_eol)を使う方が良い。 – Marty

0

EOLの回答が良いので、私はupvoteを与えています。なぜ私の機能が失敗したのかという私の質問に答えて、それはWindowsとは何の関係もないということです。問題は、Windowsマシン上のファイルに、機能が失敗したキーが重複していることでした。上記の例で

ford.car.focus.transmission=standard 
ford.car.focus.engine=four-cylinder 
ford.car.focus.engine.type=big 
ford.car.focus.fuel=gas 

、エンジンプロパティが値(四気筒)として設定された後、関数の次の反復では、別の(巣があったという事実に対処しようとしていました)for engine(タイプ= big)。オブジェクトは同じキーを2回持つことができないため、関数が死ぬ原因となっていました。

応答いただきありがとうございます。

関連する問題