javascript组数组中的唯一项

时间:2015-05-01 14:00:30

标签: javascript html arrays angularjs multidimensional-array

我有一个以下格式的数组。

    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>

在这个代码中可以看到这方面的工作。 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 个答案:

答案 0 :(得分: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) {
	product = produce[i];       
	var supplier = suppliers[product.supplierID]
	if (!supplier) {
		supplier = {id: product.supplierID, fruit: [], veg: []};
		suppliers[product.supplierID] = supplier;
		res.push(supplier);
	}

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