对具有匹配值的 JSON 键进行排序和合并
Sort and merge JSON keys with matching values
我的JSON看起来像这样:
json = [
{
type: "big"
date: "2012-12-08"
qty: 6
}
{
type: "small"
date: "2012-12-08"
qty: 9
}
{
type: "big"
date: "2012-12-15"
qty: 4
}
{
type: "small"
date: "2012-12-07"
qty: 7
}
{
type: "small"
date: "2012-11-07"
qty: 3
}
]
我正在尝试做的是分组/合并具有相同年份和月份(date
字符串中的前 7 个字符)date
的每个type
,并获取这些qty
的总和。输出应如下所示:
json = [
{
type: "big"
date: "2012-12"
qty: 10
}
{
type: "small"
date: "2012-12"
qty: 16
}
{
type: "small"
date: "2012-11"
qty: 3
}
]
我在这里发现了几个类似的问题,但还没有遇到一个完全符合我正在寻找的问题。我已经尝试了许多从不同示例中借来的代码,但似乎无法获得我需要的结果。我现在不在家,因此我目前无法粘贴我尝试过的任何代码,但我正在寻求帮助,希望有一个答案/解决方案以便以后测试
这可以通过创建一个自定义对象来处理,该对象具有以您的唯一组合命名的属性(即类型 + 日期的前 7
)。遍历数组并检查"holder"对象是否具有以唯一标识符命名的现有属性。如果它已经具有该属性,则增加数量,否则添加新项目。
完全构建支架后,清除数组,然后遍历持有者的属性并将它们推送回数组。
var holder = {};
var json = [
{
type: "big",
date: "2012-12-08",
qty: 6
},
{
type: "small",
date: "2012-12-08",
qty: 9
},
{
type: "big",
date: "2012-12-15",
qty: 4
},
{
type: "small",
date: "2012-12-07",
qty: 7
},
{
type: "small",
date: "2012-11-07",
qty: 3
}
];
json.forEach(function(element) {
var identifier = element.type + element.date.slice(0, 7);
if (holder[identifier]) {
holder[identifier].qty += element.qty;
} else {
holder[identifier] = element;
};
});
json = [];
for(var identifier in holder) {
json.push(holder[identifier]);
}
console.log(json);
替代解决方案:
var result = [];
$(json).each(function (i, e){
var search = $.grep(result, function(elm){ return e.type == elm.type && e.date.substring(0, 7) == elm.date; });
if(search.length == 0)
result.push({ type: e.type, date: e.date.substring(0, 7), qty: e.qty });
else
search[0].qty += e.qty;
});
还有一个混合,我认为这是最长的答案:-)
var sortedArray = [];
function traverseArray(element, index, array) {
var found = false;
for (i = 0; i < sortedArray.length; i++) {
if (sortedArray[i].type === element.type) {
if (sortedArray[i].date.substring(0, 7) === element.date.substring(0, 7)) {
sortedArray[i].qty = (sortedArray[i].qty + element.qty);
console.log(element);
found = true;
}
}
}
if (!found)
sortedArray.push(element);
}
var data = [{
type: "big",
date: "2012-12-08",
qty: 6
}, {
type: "small",
date: "2012-12-08",
qty: 9
}, {
type: "big",
date: "2012-12-15",
qty: 4
}, {
type: "small",
date: "2012-12-07",
qty: 7
}, {
type: "small",
date: "2012-11-07",
qty: 3
}];
data.forEach(traverseArray);
sortedArray.forEach(print);
function print(element, index, array) {
var line = "[ type: " + element.type + ", date: " + element.date + ", qty: " + element.qty + "]";
$("#result").append(line + " <br>");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>
相关文章:
- 如何合并不同集合的游标并按日期排序
- 将两个Json提要合并为一个,并按时间排序
- 根据搜索项按相关性合并和排序多个JavaScript数组
- 用Javascript实现了带有合并排序算法的反转计数
- JSON 合并、数组推送和排序和删除双精度
- 合并排序实现在 Javascript 中不起作用
- JavaScript 中的合并排序返回重复的元素
- 在 JavaScript 中合并多个排序对象数组的最有效方法是什么?
- 合并然后排序 2 个源
- 修改合并排序以在 JavaScript 中计算反转
- 在 Javascript 中实现合并排序
- 合并排序 - 自下而上比自上而下更快
- 合并来自多个 URL 的 JSON 数据并根据键对其进行排序
- 对具有匹配值的 JSON 键进行排序和合并
- 如何根据对象(而不是数组)的属性执行合并排序
- javascript 2D数组-排序和合并
- buble对数组进行排序,并在不使用javascript内置函数的情况下将它们合并
- 如何使用Javascript合并两个json并对时间值进行排序
- 在javascript中合并排序的简单实现
- 在json javascript中排序合并逻辑