2015-05-01 2 views
0

У меня есть массив в нижнем формате.javascript group уникальные элементы в массиве

var produce = [ 
     {'supplierID':1,'produceID':1, 'name':'apple', 'qty': 10}, 
     {'supplierID':1,'produceID':2, 'name':'carrot', 'qty': 10}, 
     {'supplierID':1,'produceID':2, 'name':'bean', 'qty': 20}, 
     {'supplierID':1,'produceID':1, 'name':'bananna', 'qty': 30}, 
     {'supplierID':1,'produceID':1, 'name':'orange', 'qty': 65}, 
     {'supplierID':2,'produceID':2, 'name':'pumpkin', 'qty': 120}, 
     {'supplierID':2,'produceID':2, 'name':'cucumber', 'qty': 18}, 
     {'supplierID':2,'produceID':1, 'name':'strawberry', 'qty': 130}, 
     {'supplierID':2,'produceID':1, 'name':'mango', 'qty': 60}, 
     {'supplierID':2,'produceID':1, 'name':'grapes', 'qty': 140} 
    ]; 
//produceID 1 = fruit 
//produceID 2 = veg 

Я хочу, чтобы он был в таком формате.

{ 
     'id': 1, 
     'fruit': [ 
      { 
       'name': 'apple', 
       'qty': 10 
      }, 
      { 
       'name': 'bananna', 
       'qty': 30 
      }, 
      { 
       'name': 'orange', 
       'qty': 65 
      }   
     ], 
     'veg': [ 
      { 
       'name': 'carrot', 
       'qty': 10 
      }, 
      { 
       'name': 'bean', 
       'qty': 20 
      },   
     ] 
    }, 
    { 
     'id': 2, 
     'fruit': [ 
      { 
       'name': 'strawberry', 
       'qty': 130 
      }, 
      { 
       'name': 'mango', 
       'qty': 60 
      }, 
      { 
       'name': 'grapes', 
       'qty': 140 
      }   
     ], 
     'veg': [ 
      { 
       'name': 'pumpkin', 
       'qty': 120 
      }, 
      { 
       'name': 'cucumber', 
       'qty': 18 
      },   
     ] 
    } 

Так что я могу группа моих деталей первой колесными затем по типу продукции (фрукты/овощи) (с использованием угловых JS)

 <div style="width:100%" ng-repeat="res in results"> 
     <h2>Supplier - {{res.id}}</h2> 
     <h3>Fruit</h3> 
     <ul> 
      <li ng-repeat="f in res.fruit">{{f.name}}</li> 
     </ul> 
     <h3>Veg</h3> 
     <ul> 
      <li ng-repeat="v in res.veg">{{v.name}}</li> 
     </ul> 
     </div> 

Работающими например это можно увидеть в этом codepen. http://codepen.io/anon/pen/rVVJjg

Как я могу это достичь?

До сих пор я нашел, что мне нужно найти всех поставщиков, которые я могу с помощью ниже.

//get unique suppliers 
var unique = {}; 
var distinct = []; 
    for(var i in produce){ 
    if(typeof(unique[produce[i].supplierID]) == "undefined"){ 
     distinct.push(produce[i].supplierID); 
    } 
    unique[produce[i].supplierID] = 0; 
    } 
console.log(distinct); 

Я также могу получить правильный формат для SupplierID == 1, как показано ниже, но не знаю, как я мог масштабировать это работать с несколькими поставщиками

var fruit = []; 
var veg = []; 
var res = []; 
for (var i in produce) { 

    if (produce[i].supplierID == 1) { 
     if (produce[i].produceID == 1) { 
      fruit.push(produce[i]); 
     } 
     else { 
      veg.push(produce[i]); 
     } 
    } 
} 

res.push(fruit); 
res.push(veg); 
console.log(res); 

Как я могу добиться этого?

+1

Как бы вы решили между фруктами и овощами? Например, томат - это плод :)] – mplungjan

+1

Не используйте свои собственные циклы, используйте 'sort': https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ сортировать – Adam

ответ

1

Проверьте это:

var produce = [ 
 
     {'supplierID':1,'produceID':1, 'name':'apple', 'qty': 10}, 
 
     {'supplierID':1,'produceID':2, 'name':'carrot', 'qty': 10}, 
 
     {'supplierID':1,'produceID':2, 'name':'bean', 'qty': 20}, 
 
     {'supplierID':1,'produceID':1, 'name':'bananna', 'qty': 30}, 
 
     {'supplierID':1,'produceID':1, 'name':'orange', 'qty': 65}, 
 
     {'supplierID':2,'produceID':2, 'name':'pumpkin', 'qty': 120}, 
 
     {'supplierID':2,'produceID':2, 'name':'cucumber', 'qty': 18}, 
 
     {'supplierID':2,'produceID':1, 'name':'strawberry', 'qty': 130}, 
 
     {'supplierID':2,'produceID':1, 'name':'mango', 'qty': 60}, 
 
     {'supplierID':2,'produceID':1, 'name':'grapes', 'qty': 140} 
 
    ]; 
 

 

 
res = []; 
 
suppliers = {}; 
 
for (var i in produce) { 
 
\t product = produce[i];  
 
\t var supplier = suppliers[product.supplierID] 
 
\t if (!supplier) { 
 
\t \t supplier = {id: product.supplierID, fruit: [], veg: []}; 
 
\t \t suppliers[product.supplierID] = supplier; 
 
\t \t res.push(supplier); 
 
\t } 
 

 
\t if (product.produceID == 1) {  
 
\t \t supplier.fruit.push({name: product.name, qty: product.qty}); 
 
\t } else if (product.produceID == 2) {  
 
\t \t supplier.veg.push({name: product.name, qty: product.qty}); 
 
\t } 
 
}; 
 
console.log(res);

+0

спасибо, что это именно то, что я получаю после – ak85