javascript - 在JavaScript中将相似的对象组合在一起

标签 javascript jquery json

我有一些正在获取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”属性是共享相同CodeName的服务数组:

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/

相关文章:

javascript - 通过 Controller 加载图像问题

javascript - jQuery Isotope `arrangeComplete` 监听器不触发

javascript - 在 Javascript 或 Jquery 中如何将外部 json 文件作为参数传递给函数?

javascript - 如何默认在横向模式下打印

javascript - 平均堆栈 : How to create routes for nested relationships?

javascript - 防止 angularjs 动画在加载时最初隐藏的元素上运行

javascript - 设置每个数据id并将其分配给href

php - JQuery 返回 404 的 JSON 对象

json - Dart问题与获取JSON数据

php - 在单个警报中显示多个文件输入的所有文件名