简体   繁体   English

从对象数组和另一个简单数组创建简单数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM