JavascriptでJsonファイルを読み込んで並び順を変更する

Table of Contents

Table of Contents

プロジェクトの関係で、Jsonファイルのデータを再処理することがあったので、ファイル読み取りと保存方法(fsモジュール)、配列の並び順変更の方法(sort関数)とその結果をメモしておきます。


やりたいこと


  • Jsonファイルのデータの並び順を変更したい。
  • 並び順を変更したデータを別のJsonファイルとして保存したい。

対応方法


  • ファイルの読み取りと書き出し: 「fs」モジュールでを行う。
  • 並び順の変更: sort() 関数で対応する。

Jsonファイルの読み取り、書き出し


NodeJsのfsモジュールはFile Systemを対応するAPIを実装しているので、今回はこのモジュールを使います。 まずは、const fs = require('fs'); でモジュールを利用できるようにします。

利用できるようになったら、処理したいJsonファイルが存在していることを確認してファイル内のデータを取得する。 取得したデータの並び順を変更して、別ファイルとして保存します。

処理の流れは、 Jsonファイルの確認ファイルデータ取得 → 並ぶ順変更 → 別ファイルとして保存する 下線にしている部分はfsモジュールで対応します。


Jsonファイルの確認: fs.existsSync()

if (fs.existsSync('path/fileName.json')) {
    // the file exists.
} else {
    // the file does not exist.
}

ファイルデータ取得: fs.readFileSync()

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.
}

別ファイルとして保存する: fs.writeFile()

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}`)
    }
);

最後に完成したコード


  • Jsonファイルのデータを読み取る。
  • Jsonファイルのデータの並び順を変更する。
  • 並び順を変更したデータを別のJsonファイルとして保存する。
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}`)
            }
        );
    }

参考