删除多维数组中的重复条目

shi*_*iva -1 javascript arrays

我有一个像这样的 json 对象

var data = [
      {
        "id": 24,
        "title": "BCOM",
        "start": "2014-08-05 12:59:00 PM",
        "end": "2014-08-05 2:59:00 PM",
        "description": "mcom",
        "DIFF": 120
      },
      {
        "id": 26,
        "title": "MCOM",
        "start": "2014-08-10 12:59:00 PM",
        "end": "2014-08-10 4:59:00 PM",
        "description": "mcom",
        "DIFF": 240
      },
      {
        "id": 29,
        "title": "MCOM",
        "start": "2014-08-11 12:59:00 PM",
        "end": "2014-08-11 8:59:00 PM",
        "description": "mcom",
        "DIFF": 480
      },
      {
        "id": 30,
        "title": "MCOM",
        "start": "2014-08-13 12:59:00 PM",
        "end": "2014-08-13 4:59:00 PM",
        "description": "mcom",
        "DIFF": 240
      }
    ];
Run Code Online (Sandbox Code Playgroud)

如果您在这里观察到标题 mcom 重复,如果相同的标题重复多次,我想从数组中添加“DIFF”,我想通过 javascript 实现这一点。任何人请帮助我。

我的结果应该是这样的

var data = [
      {
        "id": 24,
        "title": "BCOM",
        "start": "2014-08-05 12:59:00 PM",
        "end": "2014-08-05 2:59:00 PM",
        "description": "mcom",
        "DIFF": 120
      },
      {
        "id": 26,
        "title": "MCOM",
        "start": "2014-08-10 12:59:00 PM",
        "end": "2014-08-10 4:59:00 PM",
        "description": "mcom",
        "DIFF": 960
      },


    ];
Run Code Online (Sandbox Code Playgroud)

谢谢

web*_*eat 5

第一个解决方案(不安全)

var titles = [];
var indexes = [];
var index;
for (var i = 0; i < data.length; i++) {
    index = titles.indexOf(data[i].title);
    if(index == -1){
        titles.push(data[i].title);
        indexes.push(i);
    } else {
        data[indexes[index]].DIFF += data[i].DIFF;
        delete data[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

解释

为了删除具有重复标题的项目,我们循环遍历数组的所有项目。我们将新标题存储在titles数组中,并用它来检查重复的标题。当我们存储标题时,我们还会存储indexes表中具有该标题的第一个项目的索引。当我们找到具有重复标题的项目时,我们将其 DIFF 添加到具有该标题的第一个元素,然后将其删除。

雷马克

使用运算符delete是危险的,因为它会在数组中产生间隙。也许创建一个新数组来保存新项目会更安全。然后代码将是这样的:

更安全的解决方案

var titles = [];
var uniquesData = [];
var index;
for (var i = 0; i < data.length; i++) {
    index = titles.indexOf(data[i].title);
    if(index == -1){
        titles.push(data[i].title);
        uniquesData.push(data[i]);
    } else {
        uniquesData[index].DIFF += data[i].DIFF;
    }
}
data = uniquesData;
Run Code Online (Sandbox Code Playgroud)