如何使用Javascript更改json对象的结构

如何使用Javascript更改json对象的结构,javascript,json,angularjs,Javascript,Json,Angularjs,但问题是,如果我有3款奥迪车型,那么列表会一次又一次地重复该品牌,从而使我的列表中充满了重复的值。所以我需要制作一个json对象,如下所示: 我只想使用javascript或angularjs创建一个json对象,如下所示: I have a json object which stores all the vehicle models with their brand. [{ "brand":"Audi","model":"A4" }, { "brand":"Audi","model":"

但问题是,如果我有3款奥迪车型,那么列表会一次又一次地重复该品牌,从而使我的列表中充满了重复的值。所以我需要制作一个json对象,如下所示: 我只想使用javascript或angularjs创建一个json对象,如下所示:

I have a json object which stores all the vehicle models with their brand. 

[{
"brand":"Audi","model":"A4"
},
{
"brand":"Audi","model":"A6"
},
{
"brand":"BMW","model":"Z4"
},
{
"brand":"Audi","model":"R8"
},
{
"brand":"Volvo","model":"v40"
},
{
"brand":"BMW","model":"5 Series"
}]
根据您的意见:

 [ {"brand":"Audi","models":["A4","A6","R8"]},
    {"brand":"BMW","models":["Z4","5 Series"]},
    {"brand":"Volvo","models":["v40"]}]
您可以使用以下方法实现所需的结果:

var输出=输入.减少(功能(工作,基准){
var n=work.brands.indexOf(datum.brand);
if(n<0){
n=工作品牌推送(基准品牌)-1;
work.result.push({brand:datum.brand,models:[]});
}
work.result[n].models.push(datum.model);
返回工作;
},{brands:[],result:[]});

您可以使用angular js或javascript轻松创建JSON。您可以在AngularJS中使用以下方法。在javascript中,只需使用与“for”相同类型的循环即可

var output = input.reduce(function(work, datum) {
    var n = work.brands.indexOf(datum.brand);
    if (n < 0) {
        n = work.brands.push(datum.brand) - 1;
        work.result.push({brand: datum.brand, models: []});
    }
    work.result[n].models.push(datum.model);
    return work;
}, {brands:[], result:[]}).result;
现在returnObject将保存所需的JSON对象。

var input=[{
var model = {};
var brandList = [];
var returnObject = [];

var data = [
  {
    "brand": "Audi", "model": "A4"
  },
  {
    "brand": "Audi", "model": "A6"
  },
  {
    "brand": "BMW", "model": "Z4"
  },
  {
    "brand": "Audi", "model": "R8"
  },
  {
    "brand": "Volvo", "model": "v40"
  },
  {
    "brand": "BMW", "model": "5 Series"
  }
]

angular.forEach(data, function (dat, index) {
  if (brandList.indexOf(dat.brand) == -1) {
    brandList.push(dat.brand);
    model[dat.brand] = [];
    model[dat.brand].push(dat.model);
  } else {
    model[dat.brand].push(dat.model);
  }
});

angular.forEach(brandList, function (val, index) {
  var obj = {};
  obj.brand = val;
  obj.models = model[val];
  returnObject.push(obj);
});
“品牌”:“奥迪”, “型号”:“A4” }, { “品牌”:“奥迪”, “型号”:“A6” }, { “品牌”:“宝马”, “型号”:“Z4” }, { “品牌”:“奥迪”, “型号”:“R8” }, { “品牌”:“沃尔沃”, “型号”:“v40” }, { “品牌”:“宝马”, “型号”:“5系列” }]; //在地图中收集所有品牌和型号 var-brands\u模型={}; 对于(变量i=0;i
只有
数组.prototype.forEach
数组.prototype.some
的提案

var数据=[{
“品牌”:“奥迪”,“车型”:“A4”
}, {
“品牌”:“奥迪”,“车型”:“A6”
}, {
“品牌”:“宝马”,“车型”:“Z4”
}, {
“品牌”:“奥迪”,“车型”:“R8”
}, {
“品牌”:“沃尔沃”,“车型”:“v40”
}, {
“品牌”:“宝马”,“车型”:“5系”
}],
合并=[];
data.forEach(函数(a){
!组合。某些(功能(b){
如果(a.品牌===b.品牌){
!~b.model.indexOf(a.model)和&b.model.push(a.model);
返回true;
}
})&&combined.push({brand:a.brand,model:[a.model]});
})

document.write(''+JSON.stringify(组合,0,4)+'')我建议另一种最佳方式:
var-arr=[
{
“品牌”:“奥迪”,“车型”:“A4”
},
{
“品牌”:“奥迪”,“车型”:“A6”
},
{
“品牌”:“宝马”,“车型”:“Z4”
},
{
“品牌”:“奥迪”,“车型”:“R8”
},
{
“品牌”:“沃尔沃”,“车型”:“v40”
},
{
“品牌”:“宝马”,“车型”:“5系”
}
];
var copy=arr.slice(0);
var-res=[];
while(copy.length){//当copy为空时,它停止
var a={models:[]};//创建对象
var item=copy.shift();//item=copy[0],则已删除copy[0]
a、 品牌=项目。品牌;//当前品牌
a、 models.push(item.model);//已添加第一个模型
copy.forEach(函数(e,i){
如果(e.brand==a.brand){//找到与当前品牌相同的其他项目
a、 models.push(e.model);//其他模型已添加到模型中
copy.splice(i,1);//copy[i]已删除
}
});
res.push(a);//已添加当前品牌项
}

控制台日志(res)
您可以在
brand
上执行
groupBy
,请参考此答案@PankajParkar我不需要在UI端对其进行分组,我想使用code将其存储在另一个变量中。对术语的更正。你有一个目标-与之无关JSON@JaromandaX抱歉,我又不熟悉javascript和jsonlooking,如果这是一个文件内容,那么,是的,是JSONA,你确定吗?-您的代码将生成returnObject,其中只包含每个品牌的最后一个型号,您需要交换
model[dat.brand].push(dat.model)和<代码>型号[日期品牌]=[日期型号]您还需要声明
var brandList=[],model={},returnObject=[]-我想这就是你使用的所有额外变量。是的,我们都在做mistakes@ManijRai-我得到了这个结果[{“品牌”:“奥迪”,“车型”:[“R8”]},{“品牌”:“宝马”,“车型”:[“5系”]},{“品牌”:“沃尔沃”,“车型”:[“v40”]}]这不就是OP要求的一个对象而不是数组吗?!事实上,我得到了这样的结果:{“奥迪”:{“品牌”:“奥迪”,“车型”:[“A4”,“A6”,“R8”]},“宝马”:{“品牌”:“宝马”,“车型”:[“Z4”,“5系”]},“沃尔沃”:{“品牌”:“沃尔沃”,“车型”:[“v40”]}}。你能帮我把它改成我提到的格式吗?我知道其他答案更容易阅读,但有时也可以教你:p
var model = {};
var brandList = [];
var returnObject = [];

var data = [
  {
    "brand": "Audi", "model": "A4"
  },
  {
    "brand": "Audi", "model": "A6"
  },
  {
    "brand": "BMW", "model": "Z4"
  },
  {
    "brand": "Audi", "model": "R8"
  },
  {
    "brand": "Volvo", "model": "v40"
  },
  {
    "brand": "BMW", "model": "5 Series"
  }
]

angular.forEach(data, function (dat, index) {
  if (brandList.indexOf(dat.brand) == -1) {
    brandList.push(dat.brand);
    model[dat.brand] = [];
    model[dat.brand].push(dat.model);
  } else {
    model[dat.brand].push(dat.model);
  }
});

angular.forEach(brandList, function (val, index) {
  var obj = {};
  obj.brand = val;
  obj.models = model[val];
  returnObject.push(obj);
});
var input = [{
    "brand": "Audi",
    "model": "A4"
}, {
    "brand": "Audi",
    "model": "A6"
}, {
    "brand": "BMW",
    "model": "Z4"
}, {
    "brand": "Audi",
    "model": "R8"
}, {
    "brand": "Volvo",
    "model": "v40"
}, {
    "brand": "BMW",
    "model": "5 Series"
}];

// collect all brands models in a map
var brands_models = {};
for(var i=0; i < input.length; i++) {
 var dat = input[i];
 brands_models[dat.brand] = brands_models[dat.brand] || [];
 brands_models[dat.brand].push(dat.model);
}

// make array from map
var output = [];
foreach(var brand in brands_models) {
 output.push({
    "brand" : brand,
    "models": brands_models[brand]
  });
}