从 JSON 字符串中删除重复的日期值

Removing duplicate Date value from a JSON string

我正在处理莫里斯折线图。我从服务中得到的 json 字符串是:

{"SDate": "2017-01-21", "A": 0, "B": 0, "C": 23},
{"SDate": "2017-01-21", "A": 10, "B": 0, "C": 0},
{"SDate": "2017-01-22", "A": 20, "B": 0, "C": 0},
{"SDate": "2017-01-23", "A": 30, "B": 0, "C": 67},
{"SDate": "2017-01-24", "A": 0, "B": 13, "C": 0},
{"SDate": "2017-01-25", "A": 70, "B": 0, "C": 0},
{"SDate": "2017-01-25", "A": 3, "B": 45, "C": 0},
{"SDate": "2017-01-26", "A": 50, "B": 0, "C": 0},
{"SDate": "2017-01-27", "A": 20, "B": 0, "C": 0},
{"SDate": "2017-01-28", "A": 80, "B": 0, "C": 0}

如您所见,前两行的日期相同但值不同。 我想将两行合并为一行

{"SDate": "2017-01-21", "A": 10, "B": 0, "C": 23},

同样,2017-01-25有2行,

{"SDate": "2017-01-25", "A": 70, "B": 0, "C": 0},
{"SDate": "2017-01-25", "A": 3, "B": 45, "C": 0},

我想合并哪个

{"SDate": "2017-01-25", "A": 73, "B": 45, "C": 0},

所以最后的 JSON 字符串会像

    {"SDate": "2017-01-21", "A": 10, "B": 0, "C": 23},
    {"SDate": "2017-01-22", "A": 20, "B": 0, "C": 0},
    {"SDate": "2017-01-23", "A": 30, "B": 0, "C": 67},
    {"SDate": "2017-01-24", "A": 0, "B": 13, "C": 0},
    {"SDate": "2017-01-25", "A": 73, "B": 45, "C": 0},
    {"SDate": "2017-01-26", "A": 50, "B": 0, "C": 0},
    {"SDate": "2017-01-27", "A": 20, "B": 0, "C": 0},
    {"SDate": "2017-01-28", "A": 80, "B": 0, "C": 0}

我知道理想情况下它应该在后端处理,但我对此没有任何控制,这需要使用 javascript 修复。 现在我正在尝试 Sort and merge JSON keys with matching values 的解决方案,但没有得到想要的结果。 请帮忙

编辑 1: 这里A、B、C不是固定的。 这可以是不同的集合。 像 X、Y 或 Just W 或任何东西。 例如

{"SDate": "2017-01-21", "X": 0, "Y": 0, "Z": 23},....,{"SDate": "2017-01-28", "X": 0, "Y": 0, "Z": 23}

{"SDate": "2017-01-21", "W": 0, "B": 0, "V": 23},......,{"SDate": "2017-01-28", "W": 0, "B": 0, "V": 23},

还有.... *特定字符串的集合相同,但 A、B 和 C 不一定总是

您可以通过将 回调 函数传递给数组中的每个项目来使用 forEach 方法。

解决方案是使用 hash 结构以仅保留 唯一 值并找出重复行的总和。

let array=[{"SDate": "2017-01-21", "A": 0, "B": 0, "C": 23}, {"SDate": "2017-01-21", "A": 10, "B": 0, "C": 0}, {"SDate": "2017-01-22", "A": 20, "B": 0, "C": 0}, {"SDate": "2017-01-23", "A": 30, "B": 0, "C": 67}, {"SDate": "2017-01-24", "A": 0, "B": 13, "C": 0}, {"SDate": "2017-01-25", "A": 70, "B": 0, "C": 0}, {"SDate": "2017-01-25", "A": 3, "B": 45, "C": 0}, {"SDate": "2017-01-26", "A": 50, "B": 0, "C": 0}, {"SDate": "2017-01-27", "A": 20, "B": 0, "C": 0}, {"SDate": "2017-01-28", "A": 80, "B": 0, "C": 0}]
let result=[];
array.forEach(function (item) {
    if (!this[item.SDate]) {
        this[item.SDate] = { SDate: item.SDate };
        Object.keys(item).slice(1).forEach(function(key){
          this[item.SDate][key]=0;
        });
        result.push(this[item.SDate]);
    }
    Object.keys(item).slice(1).forEach(function(key){
          this[item.SDate][key]+=item[key];
    });
});
console.log(result);

您可以通过以下方式进行

let arr = [
{"SDate": "2017-01-21", "A": 0, "B": 0, "C": 23},
{"SDate": "2017-01-21", "A": 10, "B": 0, "C": 0},
{"SDate": "2017-01-22", "A": 20, "B": 0, "C": 0},
{"SDate": "2017-01-23", "A": 30, "B": 0, "C": 67},
{"SDate": "2017-01-24", "A": 0, "B": 13, "C": 0},
{"SDate": "2017-01-25", "A": 70, "B": 0, "C": 0},
{"SDate": "2017-01-25", "A": 3, "B": 45, "C": 0},
{"SDate": "2017-01-26", "A": 50, "B": 0, "C": 0},
{"SDate": "2017-01-27", "A": 20, "B": 0, "C": 0},
{"SDate": "2017-01-28", "A": 80, "B": 0, "C": 0}
];

arr = arr.sort((a, b) => {
        if(a.SDate < b.SDate)
            return -1;
        if(a.SDate > b.SDate)
            return 1;
        return 0;
}).reduce((a, b) => {
    if(a.length == 0){
        a.push(b);
    }
    else if(a[a.length-1].SDate != b.SDate){
        a.push(b);
    }
    else {
        a[a.length-1].A += b.A;
        a[a.length-1].B += b.B;
        a[a.length-1].C += b.C;
    }
    return a;
}, [])

console.log(arr);

这里你有不同的方法...

var yourData = [
  {"SDate": "2017-01-21", "A": 0, "B": 0, "C": 23},
  {"SDate": "2017-01-21", "A": 10, "B": 0, "C": 0},
  {"SDate": "2017-01-22", "A": 20, "B": 0, "C": 0},
  {"SDate": "2017-01-23", "A": 30, "B": 0, "C": 67},
  {"SDate": "2017-01-24", "A": 0, "B": 13, "C": 0},
  {"SDate": "2017-01-25", "A": 70, "B": 0, "C": 0},
  {"SDate": "2017-01-25", "A": 3, "B": 45, "C": 0},
  {"SDate": "2017-01-26", "A": 50, "B": 0, "C": 0},
  {"SDate": "2017-01-27", "A": 20, "B": 0, "C": 0},
  {"SDate": "2017-01-28", "A": 80, "B": 0, "C": 0}
];

var newData = {};

// Create an object using dates as indexes, so we can find it on each loop.
$.each(yourData,function(id,value) {

    if (!newData[value['SDate']])
        newData[value['SDate']] = {"SDate": value.SDate, "A": 0, "B": 0, "C": 0};

    newData[value['SDate']]["A"] += value.A;
    newData[value['SDate']]["B"] += value.B;
    newData[value['SDate']]["C"] += value.C;
});

// Remove indexes and get the desired array of values.
newData = $.map(newData,function(value,index) {
  return value;
});

console.log(newData);

希望对你有帮助

您可以采用散列 table 和密钥变量的动态方法,您喜欢分组。

其余的所有属性都用于求和。

var data = [{ SDate: "2017-01-21", A: 0, B: 0, C: 23 }, { SDate: "2017-01-21", A: 10, B: 0, C: 0 }, { SDate: "2017-01-22", A: 20, B: 0, C: 0 }, { SDate: "2017-01-23", A: 30, B: 0, C: 67 }, { SDate: "2017-01-24", A: 0, B: 13, C: 0 }, { SDate: "2017-01-25", A: 70, B: 0, C: 0 }, { SDate: "2017-01-25", A: 3, B: 45, C: 0 }, { SDate: "2017-01-26", A: 50, B: 0, C: 0 }, { SDate: "2017-01-27", A: 20, B: 0, C: 0 }, { SDate: "2017-01-28", A: 80, B: 0, C: 0 }],
    groupBy = 'SDate',
    hash = Object.create(null),
    grouped = [];

data.forEach(function (o) {
    if (!hash[o[groupBy]]) {
        hash[o[groupBy]] = {};
        hash[o[groupBy]][groupBy] = o[groupBy];
        grouped.push(hash[o[groupBy]]);
    }
    Object.keys(o).forEach(function (k) {
        if (k === groupBy) {
            return;
        }
        hash[o[groupBy]][k] = (hash[o[groupBy]][k] || 0) + o[k];
    });
});
    
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }