javascript - 将 CSV 文件转换为嵌套 JSON obj

标签 javascript json nested

我正在尝试将 CSV 文件转换为 JSON 嵌套对象。我已经实现了该任务,但我对字段进行了硬编码,如果 CSV 字段发生变化,我也必须修改代码。所以我正在寻找一种动态方法。

假设我已经从 CSV 文件中读取了行,并且创建了以下数组:

    var csv = ["ChapterIndex;ArticleIndex;URL;language/chapter/en;language/title/en;language/bodyText/en;language/keywords/en;language/languageCode/en;language/chapter/es;language/title/es;language/bodyText/es;language/keywords/es;language/languageCode/es",
    "1;1;www.hotmail.com;Overview-en;Article1-en;BodyText1-en;key1,key2;en;Overview-es;Article1-es;BodyText1-es;key1,key2;es",
    "1;1;www.google.com;Overview-en;Article2-en;BodyText2-en;key1,key2;en;Overview-es;Article2-es;BodyText2-ens;key1,key2;es"]

我想为 JSON 提供以下格式

var obj ={
     chaterIndex:1,
     articleIndex:1,
     url:"www.test.com"
     language:[
     {  chapter:"Overvie-en",
        title:"Article1-en",
        bodyText:"bodyText-en",
        keywords:"key1,key2",
        languageCode:"en"
      },
      { chapter:"Overvie-es",
        title:"Article1-es",
        bodyText:"bodyText-es",
        keywords:"key1,key2",
        languageCode:"es"
      }]
      }

到目前为止,我已经完成了一半的任务,但我的逻辑已经无法继续下去,我想请求你的帮助。

var csv = ["ChapterIndex;ArticleIndex;URL;language/chapter/en;language/title/en;language/bodyText/en;language/keywords/en;language/languageCode/en;language/chapter/es;language/title/es;language/bodyText/es;language/keywords/es;language/languageCode/es",
"1;1;www.hotmail.com;Overview-en;Article1-en;BodyText1-en;key1,key2;en;Overview-es;Article1-es;BodyText1-es;key1,key2;es",
"1;1;www.google.com;Overview-en;Article2-en;BodyText2-en;key1,key2;en;Overview-es;Article2-es;BodyText2-ens;key1,key2;es"]

var attrs = csv.splice(0,1);
var articles = csv
var result = csv.map(function(row) {
  var obj = {};
  var rowData = row.split(';');
  attrs[0].split(';').forEach(function(val, idx) {
      obj = constructObj(val, obj, rowData[idx]);
 });
 return obj;
})


function constructObj(str, parentObj, data) {
  if(str.split('/').length === 1) {
    parentObj[str] = data;
    return  parentObj;
  }
  var languages = [];
  var curKey = str.split('/')[0];
  if(!parentObj[curKey])
    parentObj[curKey] = {};
  parentObj[curKey] = constructObj(str.split('/').slice(1).join('/'), parentObj[curKey], data);
  return parentObj;
}

console.log(result);

最佳答案

var csv = ["ChapterIndex;ArticleIndex;URL;language/chapter/en;language/title/en;language/bodyText/en;language/keywords/en;language/languageCode/en;language/chapter/es;language/title/es;language/bodyText/es;language/keywords/es;language/languageCode/es",
"1;1;www.hotmail.com;Overview-en;Article1-en;BodyText1-en;key1,key2;en;Overview-es;Article1-es;BodyText1-es;key1,key2;es",
"1;1;www.google.com;Overview-en;Article2-en;BodyText2-en;key1,key2;en;Overview-es;Article2-es;BodyText2-ens;key1,key2;es"]

function camelCase(str) { 
    return str 
        .replace(/\s(.)/g, function(a) { 
            return a.toUpperCase(); 
        }) 
        .replace(/\s/g, '') 
        .replace(/^.{0,3}/, function(b) { 
            return b.toLowerCase(); 
        }); 
} 

var attrs = csv.splice(0,1);
var articles = csv
var result = csv.map(function(row) {
  var obj = {};
  var rowData = row.split(';');
  attrs[0].split(';').forEach(function(val, idx) {
      obj = constructObj(val, obj, rowData[idx]);
 });
 return obj;
})


function constructObj(str, parentObj, data) {
  if(str.split('/').length === 1) {
    parentObj[camelCase(str)] = data;
    return  parentObj;
  }
  // language
  var curKey = str.split('/')[0]; 
  if(!parentObj[curKey]) {
    parentObj[curKey] = [];
    newLang = {} 
    newLang[str.split('/')[1]] = data;
    parentObj[curKey].push(newLang); 
  } else {
    var found = false;
    for (var i = 0; i < parentObj[curKey].length; i++) {
      if(Object.values(parentObj[curKey][i])[0] !== undefined && Object.values(parentObj[curKey][i])[0].includes(str.split('/').slice(2))) {
        parentObj[curKey][i][str.split('/')[1]] = data;
        found = true;
        break;
      }
    }
    if (!found) {
      newLang = {} 
      newLang[str.split('/')[1]] = data;
      parentObj[curKey].push(newLang);
    }
  }
  return parentObj;
}

console.log(result);

关于javascript - 将 CSV 文件转换为嵌套 JSON obj,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58816723/

相关文章:

javascript - 单击我的菜单时,如何根据显示的菜单使两个无序列表淡入淡出?

android - 使用双方值解析 JSON

json - Grails JSON 数组

javascript - JS if else 条件基于 if div 元素更改 > 然后填充数据字段

python - 如何(或是否有可能)使用列表来提取 Python 中的嵌套字典?

javascript - react-native-modal-dropdown 无法以编程方式更改所选内容

javascript - 如何从 Firefox 插件中加载文件

c++ - 嵌套 friend 类所需的前向声明

javascript - 如何在列表中显示时更改 JSON 数据的值?

tags - 关于 Mongoid/MongoDB 标签树结构的建议