我有一个json数组和一个简单的数组。这个json中的每个对象都有三个键和一个键。另一个具有唯一值的简单数组。
var jsonArr=[{
amount: "2",
club: "xyz",
member: "tmm"
},
{
amount: "3",
club: "xyz",
member: "tsj"
},
{
amount: "4",
club: "xyz",
member: "tsj"
},
{
amount: "5",
club: "ama",
member: "vbr"
},
{
amount: "6",
club: "ama",
member: "vbr"
},
{
amount: "7",
club: "crm",
member: "vbr"
},
{
amount: "8",
club: "mic",
member: "wjr"
}]
简单的成员数组
var smpMember =['tmm','tsj','vbr','wjr']
简单的俱乐部阵列
var smpClub=['xyz','ama','crm','mic']
我打算为每个成员创建一个简单的金额值数组。如果该成员订阅了一个俱乐部,它将添加其金额值,如果不是,它将为其分配一个零。 例如,成员 tmm 订阅了俱乐部xyz,因此它的数组就像
var tmm =[2,0,0,0];
成员 vbr 再次订阅了俱乐部 ama 两次。所以它的数组将是
var vbr =[0,11,0,0]; // 11 is sum of 6 & 5
因此每个成员都会有数组
我尝试了什么?
我正在循环从smpMember数组中获取每个成员并检查每个json对象中是否存在该成员。
for(var i=0,j=smapMember.length;i<j;i++){ // Loop through array of members & pick each member
for(var x=0,y=jsonArr.length;x<y;x++){ // Loop through jsaon array of objects
var _sAmt =0;
if(smapMember[i]==jsonArr[x].member){ // check if member exist
_sAmt =jsonArr[x].amount;
if(y > (x+1)){ // Check for last element
if(jsonArr[x].club ==jsonArr[x+1].club){
_sAmt +=jsonArr[x+1].amount;
}
else{
_sAmt =0
}
}
}
var tempArr.push(_sAmt);
}
但我无法获得结果。另外我觉得使用太多if -else
是一种开销。我可以有更好的解决方案。
答案 0 :(得分:2)
我认为你可以在会员和俱乐部之间建立邻接矩阵。
var result = [];
for (var i = 0; i < smpMember.length; i++) {
var amt = [];
for (var j = 0; j < smpClub.length; j++) {
var club = smpClub[j];
var member = smpMember[i];
var amount = 0;
jsonArr.forEach(function (obj) {
if (obj.member == member && club == obj.club) {
amount += +obj.amount;
}
});
amt[j] = amount;
}
result[i] = amt;
}
console.log(result);
结果将是:
[ [ 2, 0, 0, 0 ],
[ 7, 0, 0, 0 ],
[ 0, 11, 7, 0 ],
[ 0, 0, 0, 8 ] ]
这里使用会员和俱乐部索引,你可以获得金额。
示例:
tmm -> 0
xyz -> 0
amount = 2
tsj -> 1
xyz -> 0
amount = 7
像这样的另一个版本
var result = {};
for (var i = 0; i < smpMember.length; i++) {
var amt = [];
for (var j = 0; j < smpClub.length; j++) {
var club = smpClub[j];
var member = smpMember[i];
var amount = 0;
jsonArr.forEach(function (obj) {
if (obj.member == member && club == obj.club) {
amount += +obj.amount;
}
});
amt[club] = amount;
}
result[member] = amt;
}
console.log(result);
结果将是:
{ tmm: [ xyz: 2, ama: 0, crm: 0, mic: 0 ],
tsj: [ xyz: 7, ama: 0, crm: 0, mic: 0 ],
vbr: [ xyz: 0, ama: 11, crm: 7, mic: 0 ],
wjr: [ xyz: 0, ama: 0, crm: 0, mic: 8 ] }
使用会员和俱乐部,您可以获得金额。
示例:
console.log(result['tmm']['xyz']); //2
答案 1 :(得分:0)
您可以使用array.map
var jsonArr = [{
amount: "2",
club: "xyz",
member: "tmm"
}, {
amount: "3",
club: "xyz",
member: "tsj"
}, {
amount: "4",
club: "xyz",
member: "tsj"
}, {
amount: "5",
club: "ama",
member: "vbr"
}, {
amount: "6",
club: "ama",
member: "vbr"
}, {
amount: "7",
club: "crm",
member: "vbr"
}, {
amount: "8",
club: "mic",
member: "wjr"
}];
function getUniqueElements(array, key) {
// create value array
var temp = array.map(function(item) {
return item[key]
});
// remove duplicate values
var result = temp.filter(function(item, index) {
return temp.indexOf(item) == index;
});
return result;
}
var clubArr = getUniqueElements(jsonArr, "club");
var memberArr = getUniqueElements(jsonArr, "member");
console.log(clubArr, memberArr);
答案 2 :(得分:0)
这对我有用
var arr = [];
for(var i = 0; i < smpMember.length; i++ ){
arr[i] = {};
arr[i].name = smpMember[i];
arr[i].values = Array.apply(null, {length: smpClub.length}).map(function(){return 0;}, function(){return 0});
for(var j = 0; j < jsonArr.length; j++ ){
if(jsonArr[j].member === smpMember[i]){
var index = smpClub.indexOf(jsonArr[j].club);
arr[i].values[index] += parseInt(jsonArr[j].amount);
}
}
}
我是arr数组,你将拥有成员名称和数量数组
的对象