在Javascript中构建嵌套JSON

在Javascript中构建嵌套JSON,javascript,arrays,json,javascript-objects,Javascript,Arrays,Json,Javascript Objects,我想使用JavaScript或Angularjs或任何JavaScript库将此示例数据集复制到嵌套的JSON中 数据: Javascript: var file = reader.result; var singleRow = readerFile.split(/\r\n|\n/); var header = singleRow[0].split(','); var result =[]; for ( var i=1; i < file.length; i++ ){

我想使用JavaScript或Angularjs或任何JavaScript库将此示例数据集复制到嵌套的JSON中

数据:

Javascript:

var file = reader.result; 
var singleRow = readerFile.split(/\r\n|\n/);
var header = singleRow[0].split(',');
var result =[];  

    for ( var i=1; i < file.length; i++ ){                                      
        var elementData = singleRow[i].split(',');                              
        elementData = elementData.filter(function(n){ return n != "" });        
        var Obj = {};                                                           

        for ( var j=0; j < header.length; j++ ){
            Obj[header[j]] = elementData[j];
            /*
              - How can i build child object and append back to Obj before j loop
              - How can i build multiple child for same parent 
            */                  
        }
        result.push(Obj);                                                       
    }
    console.log(" Print the JSON Object : " + JSON.stringify(result));

如果Firstname、Lastname和City具有相同的值,那么CarName和DogName值应该是同一父对象下的子对象

首先,因为您已经知道属性名称,所以解析第一行没有意义

我会这样做:

let results = {};
for (let i = 1; i < file.length; i++) {
  let entry = getEntry(results, file[i][0]);
  entry.DogName.push(file[i][DOGNAME_INDEX]);
  entry.CarName.push(file[i][CARNAME_INDEX]);
  entry.LastName = file[i][LASTNAME_INDEX];
  ...
}

// and now to convert this into an array
let array = Object.keys(results).map(key => results[key]);


// retrieves or creates an entry for a given primary key
function getEntry(results, id) {
  return results[id] || (results[id] = {});
}
let results={};
for(设i=1;iresults[key]);
//检索或创建给定主键的项
函数getEntry(结果,id){
返回结果[id]| |(结果[id]={});
}

您也可以更喜欢动态地确定列索引是什么,但我的方法使事情变得简单。

我对初始代码进行了一点重新格式化,但它不会更改初始逻辑。一个关键的观察结果是,即使
FirstName
LastName
City
是相同的,也可能不是唯一的人,因此您应该使用
PrimaryId
来确定唯一性

查看后处理部分以了解新代码:

const data = `PrimaryId,FirstName,LastName,City,CarName,DogName
100,John,Smith,NewYork,Toyota,Spike
100,John,Smith,NewYork,BMW,Spike
100,John,Smith,NewYork,Toyota,Rusty
100,John,Smith,NewYork,BMW,Rusty
101,Ben,Swan,Sydney,Volkswagen,Buddy
101,Ben,Swan,Sydney,Ford,Buddy
101,Ben,Swan,Sydney,Audi,Buddy
101,Ben,Swan,Sydney,Volkswagen,Max
101,Ben,Swan,Sydney,Ford,Max
101,Ben,Swan,Sydney,Audi,Max
102,Julia,Brown,London,Mini,Lucy`;

var singleRow = data.split(/\r\n|\n/);
var header = singleRow[0].split(',');
var result =[];

for (var i = 1; i < singleRow.length; i++) {
  var elementData = singleRow[i].split(',');
  elementData = elementData.filter(function(n) { return n != '' });
  var Obj = {};
  for ( var j=0; j < header.length; j++ ){
    Obj[header[j]] = elementData[j];
  }
  result.push(Obj);
}

console.log(JSON.stringify(result, null, 2));


// Post-processing code starts here
const people = {};

// Create a map of unique people first
result.forEach(function (object) {
  if (!people[object.PrimaryId]) {
    people[object.PrimaryId] = {
      City: object.City,
      FirstName: object.FirstName,
      PrimaryId: object.PrimaryId,
      LastName: object.LastName,
      CarName: [],
      DogName: [],
    };
  }
  // As you iterate through your results, if this person already exists
  // add to their array of car and dogs.
  people[object.PrimaryId].CarName.push(object.CarName);
  people[object.PrimaryId].DogName.push(object.DogName);
});

// Convert back into an array
const peopleList = [];
Object.keys(people).forEach(function (primaryId) {
  peopleList.push(people[primaryId]);
})

console.log(peopleList);
const data=`PrimaryId、FirstName、LastName、City、CarName、DogName
100,约翰,史密斯,纽约,丰田,斯派克
100,约翰,史密斯,纽约,宝马,斯派克
100,约翰,史密斯,纽约,丰田,拉斯蒂
100,约翰,史密斯,纽约,宝马,拉斯蒂
101,本,斯旺,悉尼,大众,巴迪
101,本,斯旺,悉尼,福特,伙计
101,本,斯旺,悉尼,奥迪,巴迪
101,本,斯旺,悉尼,大众,马克斯
101号,本,斯旺,悉尼,福特,马克斯
101,本,斯旺,悉尼,奥迪,马克斯
102、茱莉亚、布朗、伦敦、米尼、露西;
var singleRow=data.split(/\r\n |\n/);
var header=singleRow[0]。拆分(',');
var结果=[];
对于(变量i=1;i
为您制作了一把小提琴,它以与您呈现的不同的顺序提供了所需的输出

您可以保存标题的索引:

var Index = {};
for(var k = 0; k < header.length; k++)
{
    Index[header[k]] = k;
}
要稍后使用,以便在城市已存在时不继续创建更多对象,请执行以下操作:

obj = result.data[cities.indexOf(data[Index["City"]])];

JSFiddle:

无论如何,应该用于分组数据的是
PrimaryId
字段吗?也就是说,假设给定ID始终具有相同的名字和姓氏以及城市是否安全,或者这些字段是否也可能最终成为给定ID中的数组?一个完全通用的解决方案需要允许任何字段重复,但如果只有两个特定字段且字段名称始终相同,那么不太通用的代码可能会更简单。我不知道正确和详细的答案,但我认为您应该查看hashmap或hashtable数据结构,其中具有特定键的对象只能出现一个。只需浏览所有行并搜索id,如果不存在,则创建一个新的id。然后根据是单值还是多值更新或添加所有其他字段。@nnnnnn谢谢,我更正了我的问题。是的,我们可以假设3列条目是samethanks man,您如何构建CarName的对象而不是仅仅附加值?例如`卡纳姆:[“类型1”:“大众”、“类型2”:“福特”、“类型3”:“奥迪”]`
var Index = {};
for(var k = 0; k < header.length; k++)
{
    Index[header[k]] = k;
}
var cities = [];
....
cities.push(data[Index["City"]]);
obj = result.data[cities.indexOf(data[Index["City"]])];