如何使用Javascript更改json对象的结构
但问题是,如果我有3款奥迪车型,那么列表会一次又一次地重复该品牌,从而使我的列表中充满了重复的值。所以我需要制作一个json对象,如下所示: 我只想使用javascript或angularjs创建一个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":"
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]
});
}