[英]Create simple array from a array of objects & another simple array
I have a json array and a simple array. 我有一个json数组和一个简单的数组。 Each object in this json has three keys & another simple array with unique values.
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"
}]
simple Array of members 简单的成员数组
var smpMember =['tmm','tsj','vbr','wjr']
simple Array of clubs 简单的俱乐部
var smpClub=['xyz','ama','crm','mic']
I intend to create a simple array of amount value for each of the member.If the member has subscribe to a club it will add its amount value, if not it will assign a zero to it. 我打算为每个成员创建一个简单的金额数组,如果该会员订阅了一个俱乐部,它将添加其金额值,否则将为其分配零。 For example member tmm has subscribe to club xyz so the array for it will be like
例如,成员tmm已订阅了xyz俱乐部,因此其数组将类似于
var tmm =[2,0,0,0];
Again member vbr has subscribe to club ama twice. 会员vbr再次两次订阅了ama俱乐部。 So array for it will be
所以阵列将是
var vbr =[0,11,0,0]; // 11 is sum of 6 & 5
So there will be array for each of the member 所以每个成员都有一个数组
What I tried? 我尝试了什么?
I am looping taking each of the member from smpMember array and checking if that member exist in each of the json object. 我循环从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);
}
But I am not able to sucessfuly get the result. 但是我无法成功获得结果。 Also I feel using too much
if -else
is an overhead. if -else
是开销,我也觉得使用过多。 Can I have a better solution of it. 我能为它提供更好的解决方案吗?
I think you can create adjacency matrix between member and club. 我认为您可以在会员和俱乐部之间创建邻接矩阵。
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);
Result will be: 结果将是:
[ [ 2, 0, 0, 0 ],
[ 7, 0, 0, 0 ],
[ 0, 11, 7, 0 ],
[ 0, 0, 0, 8 ] ]
Here using by member and club indexes, you can get amount. 在这里使用会员和俱乐部索引,您可以获得数量。
Examples: 例子:
tmm -> 0
xyz -> 0
amount = 2
tsj -> 1
xyz -> 0
amount = 7
Another version like this 这样的另一个版本
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);
Result will be: 结果将是:
{ 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 ] }
Using by member and club you can get amount. 通过会员和俱乐部使用,您可以获得数量。
Example: 例:
console.log(result['tmm']['xyz']); //2
You can use array.map
您可以使用
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);
This works for me 这对我有用
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);
}
}
}
I arr array you will have objects with member name and his amount array 我arr数组,您将拥有带有成员名称和其金额数组的对象
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.