使用jQuery - 我想比较2个JSON数组:
origArray 来自数据库/ C#API:
var origArray = [ {
"TypeName": "Single",
"TypeID": "3121",
"TypeCount": "2"
},
{
"TypeName": "Double",
"TypeID": "4056",
"TypeCount": "2"
},
{
"TypeName": "Family",
"TypeID": "5654",
"TypeCount": "4"
}
];
从用户输入收集userArray :
var userArray = [ {
"TypeID": "3121",
"TypeCount": "2"
},
{
"TypeID": "4056",
"TypeCount": "3"
},
{
"TypeID": "3121",
"TypeCount": "3"
}
];
我想做的是,通过 userArray 循环,然后通过 TypeID 循环“分组”,并对 TypeCount 求和。
所以在上面的例子中:
TypeID: 3121
TypeCount: 5 (ie. 2 + 3)
TypeID: 4056
TypeCount: 3
意味着TypeID 3121会有3个差异,4056会有1个差异。
有没有办法从jQuery或本机Javascript(可以跨浏览器工作)获取该信息?
感谢您的帮助,
标记
答案 0 :(得分:1)
定义一个函数,按每个数组分组TypeID
和总和TypeCount
:
function groupByTypeID (arr) {
var groupBy = {};
$.each(arr, function () {
var currentCount = groupBy[this.TypeID] || 0;
groupBy[this.TypeID] = currentCount + parseInt(this.TypeCount);
});
return groupBy;
}
然后,对两个数组进行分组,并区分它们:
var userArrayGroups = groupByTypeID(userArray);
var origArrayGroups = groupByTypeID(origArray);
var diff = {};
for (var prop in userArrayGroups) {
diff[prop] = userArrayGroups[prop] - origArrayGroups[prop];
}
diff
将保留以下内容:
{
3121: 3
4056: 1
}
<强> DEMO 强>
答案 1 :(得分:1)
如果您熟悉C#这个js库 - linqjs。 它包含所有.NET 4.0 LINQ方法的实现和许多额外的方法。
答案 2 :(得分:1)
你可以使用Underscore:
var result = _.chain(userArray)
.groupBy(function(value) {
// group by the TypeId
return value.TypeID;
})
.map(function(value) {
// iterate over every group
var addition = _.chain(value)
.pluck("TypeCount") // create an array with TypeCount values
.reduce(function(memo, num) {
return Number(memo) + Number(num); // add all the TypeCount values
})
.value();
return {
"TypeID": value[0].TypeID, // TypeID
"TypeCount": addition // total addition for this TypeID
};
})
.value();
这里的工作示例:http://livecoding.io/3498441
答案 3 :(得分:1)
我会有机会......
var mergeArray = []
var index;
for (var i = userArray.length - 1; i >= 0; i--) {
index = findByTypeID(mergeArray, userArray[i].TypeID);
if(!index){
mergeArray[index].TypeCount += parseInt(userArray[i].TypeCount)
} else{
mergeArray.push({
"TypeID": userArray[i].TypeID,
"TypeCount": parseInt(userArray[i].TypeCount)
});
}
};
function findByTypeID(arr, id){
for (var i = arr.length - 1; i >= 0; i--) {
if(arr[i].TypeID == id)
return i;
};
return -1;
}
这为您提供了mergeArray
答案 4 :(得分:-1)
result = {};
for (var i in userArray) {
var elem = userArray[i]
if (!result[elem.TypeID])
result[elem.TypeID] = elem.TypeCount;
else
result[elem.TypeID] += elem.TypeCount;
}
return result;