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

时间:2015-11-27 11:15:19

标签: javascript arrays

我有一个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是一种开销。我可以有更好的解决方案。

3 个答案:

答案 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数组,你将拥有成员名称和数量数组

的对象