你多少需要写点脚本——她可能不懂JSON

81 阅读2分钟

前言

毕业的第8年,写前端的第7年。今年浏览掘金的频率感觉超过了前些年的总和,看得多了就发现这方天地里生活着很多有趣的灵魂。而我却为了这

首次成功发布文章,奖励矿石 10000

在掘金第一次写作文。

聊点工作的

在我得颈椎病前我就意识到,解放双手的工作脚本是必须的。前端多多少少都会点nodejs,不写一点白瞎这前端必备的nodejs环境了。

Who is Json

sequenceDiagram
participant Mimosa
Note right of Mimosa : 产品
participant Julian
Note left of Julian : 开发
Mimosa->>Julian: Hi Julian, The English translation here is not correct.?
Julian-->>Mimosa: 嗯,我不晓得是不是 correct,但是有道翻译就是这么translation的
Mimosa->>Julian:Can you send me these translated texts? I'm here to find a client to translate.
Julian-->>Mimosa: 好的,我现在发给你!
Julian-->>Mimosa: Hi Mimosa, json发你了
Mimosa->>Julian: Json?Who is Json?
Mimosa->>Julian: Ok, I got it. But I cannot open it.Can u send me an excel?
Julian-->>Mimosa: 嗯,确实excel方便些。我把他转一下。
忘了具体从什么时候开始,我喜欢在自己的项目里加一个script目录。它总能在一些特定的时刻帮我解决一些问题。
他可以是`.js``.mjs``.py``.sh` 任何你可能会用得到的。

先来分析一下关系

I18n

通常来讲你不论你是 react 还是 vue,你大概都会有这样一个类似目录。

.
└── I18n
    ├── index.js
    └── lang
        ├── en
        │   ├── index.js
        │   └── *.json
        └── zh
            ├── index.js
            └── *.json

I18n/lang/en/index.jsI18n/lang/zh/index.js 导出了一个 json 集合所以我们不需要直接操作 json 文件,而是对 js 导出的 Object 进行 Read操作。

table

再经过一点 White 操作后,我们希望生成的表格长起来像这样

keyzhen
test测试test

要想写出这样的表格,我们需要借助node-xlsx

xlsx.build() 接收这样一个结构的参数:

{
    name: '',
    data: [
            ['key', 'zh', 'en'],
            ['test', '测试', 'test']
          ]
}

jsonToSheet

function jsonToSheet (zh, en) {  
  let data = []
  function loop(zh, en, key) {
    Object.keys(zh).forEach(
      i => {
        switch (typeof zh[i]) {
          case 'object':
          loop(zh[i], en[i], `${key||''}${i}.`)
          break;
          case 'string':
          data.push([`${key||''}${i}`, zh[i], en[i]])
          break;
          default:
          break;
        }
      }
    )
  }

  loop(zh, en)
  return Object.keys(zhCN).map(i => {
    return {
      name: i,
      data: [['key', 'zh-CN', 'en-US']].concat(data.filter(j => j[0].split('.')[0] === i))
    }
  })
}

有了这一步基本上我们需要的结构就有了,而下一步仅仅只需调用 xlsx.build() 后一个写文件的操作。

const buffer = xlsx.build(sheets);
fs.writeFile(path.resolve(`./jsonToSheets.xlsx`), buffer, (err) => {
  if (err) throw err;
});