我有一些正在获取JSON的JavaScript,并且我试图将某些信息行组合在一起以在表中使用。
JSON如下所示:
[{"Code":"12345","Name":"foo","Service":"Payments"},
{"Code":"12345","Name":"foo","Service":"Marketing"},
{"Code":"23456","Name":"bar","Service":"Payments"},
{"Code":"23456","Name":"bar","Service":"Development"},
{"Code":"34567","Name":"baz","Service":"Marketing"}]
基本上,有些行彼此共享完全相同的信息,除了一个字段
Service
。我的想法是尝试将每一行变成一个对象,我可以更新该对象或与共享同一
Code
的另一个对象合并。该对象和代码如下所示:
function CustObj(code,name,hasPay,hasMarket,hasDev) {
this.code = code;
this.name = name;
this.hasPay = hasPay;
this.hasMarket = hasMarket;
this.hasDev = hasDev;
}
function formatData(data) {
var formatedData = [];
for (var key in data) {
var customer = new CustObj(data[key].Code,data[key].Name);
switch (data[key].Service) {
case 'Payments':
customer.hasPay = true;
break;
case 'Marketing':
customer.hasMarket = true;
break;
case 'Development':
customer.hasDev = true;
break;
}
formatedData.push(school);
}
}
问题是我想为每个唯一的
Code
创建一个对象,但是该对象具有基于Service
的正确标记数量,但是我还没有弄清楚该怎么做。我当时正在考虑做类似$.extend(formatedData,customer)
的操作来合并对象,但是似乎找不到正确的逻辑来定位我要合并的两个对象。关于如何实现这一目标有什么想法?
最佳答案
您可以处理重复数组,并创建一个新数组,其中“ Service”属性是共享相同Code
和Name
的服务数组:
var data = [
{"Code":"12345","Name":"foo","Service":"Payments"},
{"Code":"12345","Name":"foo","Service":"Marketing"},
{"Code":"23456","Name":"bar","Service":"Payments"},
{"Code":"23456","Name":"bar","Service":"Development"},
{"Code":"34567","Name":"baz","Service":"Marketing"}
];
function mergeServices(data) {
var result = [], item, match, found;
// for each array item
for (var i = 0; i < data.length; i++) {
item = data[i];
found = false;
for (var j = 0; j < result.length; j++) {
// see if we have a dup of a previously existing item
if (item.Code == result[j].Code && item.Name == result[j].Name) {
// just add the Service name to the array of the previous item
result[j].Service.push(item.Service);
found = true;
break;
}
}
if (!found) {
// copy the current row (so we can change it without changing original)
var newItem = {};
for (var prop in item) {
newItem[prop] = item[prop];
}
// convert service to an array
newItem.Service = [newItem.Service];
result.push(newItem);
}
}
return result;
}
var output = mergeServices(data);
产生这个
output
:[
{"Code":"12345","Name":"foo","Service":["Payments","Marketing"]},
{"Code":"23456","Name":"bar","Service":["Payments","Development"]},
{"Code":"34567","Name":"baz","Service":["Marketing"]}
]
工作jsFiddle:http://jsfiddle.net/jfriend00/6rU2z/
关于javascript - 在JavaScript中将相似的对象组合在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23836543/