从 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; }
我正在处理莫里斯折线图。我从服务中得到的 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; }