JS递归清洗数据的实现

JS递归清洗数据的实现
 最后更新于 2024年10月03日 02:55:57

京东在移动端的全国城市数据格式:

cb_getprovinceAH({
  "2652": ["乌鲁木齐市", {
    "2653": ["乌鲁木齐县", {
      "36689": "水西沟镇",
      "36690": "安宁渠镇",
      "36691": "青格达湖乡",
      "36692": "萨尔达坂乡",
      "36693": "六十户乡",
      "36694": "板房沟乡",
      "36695": "甘沟乡",
      "36696": "永丰乡",
      "36697": "托里乡"
    }],
    ****
  }],
  "2656": ["石河子市", {
    "2657": ["石河子市", {
      "15954": "北泉镇",
      "15955": "石河子镇",
      "15956": "兵团一五二团",
      "51879": "城区"
      }]
    }]
  }]

需要的数据格式:

{
  "label": "乌鲁木齐市",
  "value": "2652",
  "children": [
    {
      "label": "乌鲁木齐县",
      "value": "2653",
      "children": [
        {"label": "水西沟镇", "value": "36689"}
      ]
    }
  ]
}

代码实现:

var fs = require('fs');
var os = require('os');
var path = require('path');
var limit = /windows/i.test(os.type()) ? '\\' : '/';

function readFileList (rootPath) {
  return new Promise(function (resolve, reject) {
    try {
      var files = fs.readdirSync(rootPath);
    } catch (err) {
      reject(err);
    }

    files.map(function (itm) {
      try {
        var stat = fs.statSync(`${rootPath}${limit}${itm}`);
      } catch (err) {
        reject(err);
      }

      // 如果是文件
      if (stat.isFile()) {
        // 打开文件
        fs.open(`${rootPath}${limit}${itm}`, 'r+', function(err, fd) {
          if (err) reject(err);

          // 读取文件内容
          fs.readFile(`${rootPath}${limit}${itm}`, function (err, data) {
            if (err) reject(err);

            data = data.toString().replace(/cb_getprovince[A-Z]{1,10}\(/ig, '').slice(0, -1);
            var _json = JSON.parse(data);
            var _result = [];

            function handleMishData (data, result) {
              var _keys = Object.keys(data);

              for (var i = 0, j = _keys.length; i < j; i++) {
                var _object = {};
                var _value = data[_keys[i]];
                var _dataType = Object.prototype.toString.call(_value);

                _object['label'] = _dataType === '[object String]' ? _value : _value[0];
                _object['value'] = _keys[i];

                if (result.hasOwnProperty('children')) {
                  result['children'].push(_object);
                } else {
                  result.push(_object);
                }

                if (_dataType === '[object Array]') {
                  _object['children'] = [];
                  handleMishData(_value[1], _object);
                }
              }
            }

            handleMishData(_json, _result);

            resolve(_result);
          });
        });
      }
    });
  });
}

// 获取文件夹下的所有文件
function getFileList (rootPath) {
  return new Promise(function (resolve, reject) {
    try {
      resolve(readFileList(rootPath));
    } catch (error) {
      reject(error);
    }
  });
}

getFileList(path.resolve(__dirname, './dataSource')).then(function (resultData) {
  // 检测目录是否存在
  fs.exists('./result', function (isMkdir) {
    if (isMkdir) {
      // 写入文件
      writeFile();
    } else {
      // 创建目录
      fs.mkdir('./result', function (err) {
        if (err) return console.error(err);

        writeFile();
      });
    }
  });

  function writeFile () {
    fs.writeFile('./result/result.js', JSON.stringify(resultData),  function(err) {
      if (err) return console.error(err);

      console.log("数据写入成功!");
    });
  }
}, function (error) {
  console.error(error);
});