プロジェクトの関係で、Jsonファイルのデータを再処理することがあったので、ファイル読み取りと保存方法(fsモジュール)、配列の並び順変更の方法(sort関数)とその結果をメモしておきます。
NodeJsのfsモジュールはFile Systemを対応するAPIを実装しているので、今回はこのモジュールを使います。
まずは、const fs = require('fs');
でモジュールを利用できるようにします。
利用できるようになったら、処理したいJsonファイルが存在していることを確認してファイル内のデータを取得する。 取得したデータの並び順を変更して、別ファイルとして保存します。
処理の流れは、 Jsonファイルの確認 → ファイルデータ取得 → 並ぶ順変更 → 別ファイルとして保存する 下線にしている部分はfsモジュールで対応します。
if (fs.existsSync('path/fileName.json')) {
// the file exists.
} else {
// the file does not exist.
}
if (fs.existsSync('path/fileName.json')) {
// the file exists.
const jsonObject = JSON.parse(fs.readFileSync('path/fileName', 'utf8')); // read data
} else {
// the file does not exist.
}
if (fs.existsSync('path/fileName.json')) {
// the file exists.
const jsonObject = JSON.parse(fs.readFileSync('path/fileName', 'utf8')); // read data
...
// save as a json file.
fs.writeFile('path/result.json',
JSON.stringify(sortFiles, undefined, 1),
(err) => {
if (err) console.log(`error!::${err}`)
}
);
} else {
// the file does not exist.
}
fsモジュールの部分は以上です。 その後は、今回やりたいことの中に一番重要な部分:並び順変更
この部分は、Javascriptの配列のsort()関数を使います。 例えば、こんな形式のデータがあります。
array = [
{id: 1, value: 20},
{id: 2, value: 19},
{id: 9, value: 11},
{id: 6, value: 14},
{id: 4, value: 16}
]
id順(小→大)で並びたい場合 ( order by id asc)
array.sort((a, b) => {
if (a.id < b.id) {
return -1;
}
if (a.id > b.id) {
return 1;
}
return 0;
})
value逆順(大→小)で並びたい場合 ( order by value desc)
array.sort((a, b) => {
if (a.value > b.value) {
return -1;
}
if (a.value < b.value) {
return 1;
}
return 0;
})
今回処理したいJsonファイルのデータはこんな感じです。
{
"fileMap": {
"key1": {
"title": "A",
"created_at": "2019-08-10T00:00:00.000Z",
"updated_at": "2019-08-10T00:00:00.000Z",
"description": "this is the description",
},
"key2": {
"title": "B",
"created_at": "2019-08-11T00:00:00.000Z",
"updated_at": "2019-08-11T00:00:00.000Z",
"description": "this is the description",
},
...
},
"sourceFileArray": [
...
]
}
並び順の条件は、fileMap内のデータを更新日時によって並び順を変えて欲しいです。 新 → 旧でデータを並びたい。
ただ、fileMapのデータは配列ではないので、配列に変更してから、並ぶ順を変更します。
処理の流れは、 ① sort()使うため、objectをarrayに変更 ② sort()で並び順変更
const jsonObject = JSON.parse(fs.readFileSync('path/fileName', 'utf8')); // read data
var sortFiles = {
"fileMap": []
}
// ① change to array
Object.keys(jsonObject.fileMap).forEach((element) => {
sortFiles.fileMap.push(jsonObject.fileMap[element])
})
// ② order by updated_at desc
sortFiles.fileMap.sort((a, b) => {
var dateA = Date.parse(a.updated_at);
var dateB = Date.parse(b.updated_at);
if (dateA > dateB) return -1;
if (dateA < dateB) return 1;
return 0;
})
fs.writeFile(`${dir}/summary-order-by-updated-desc.json`,
JSON.stringify(sortFiles, undefined, 1),
(err) => {
if (err) console.log(`error!::${err}`)
}
);
if (fs.existsSync(`${dir}/summary.json`)) {
const jsonObject = JSON.parse(fs.readFileSync(`${dir}/summary.json`, 'utf8'));
var sortFiles = {
"fileMap": []
}
Object.keys(jsonObject.fileMap).forEach((element) => {
sortFiles.fileMap.push(jsonObject.fileMap[element])
})
sortFiles.fileMap.sort((a, b) => {
var dateA = Date.parse(a.updated_at);
var dateB = Date.parse(b.updated_at);
if (dateA > dateB) return -1;
if (dateA < dateB) return 1;
return 0;
})
fs.writeFile(`${dir}/summary-order-by-updated-desc.json`,
JSON.stringify(sortFiles, undefined, 1),
(err) => {
if (err) console.log(`error!::${err}`)
}
);
}