2016-06-15 91 views
0

如何將具有項目的項目數組轉換爲項目爲對象的類別?與項目類別的項目數組

項目

var items = [ 
    { 
     itemId: 111111, 
     title: 'Item-1', 
     sellerName: 'seller-1', 
     category: 'Electronics, Fitness' 
    }, 
    { 
     itemId: 222222, 
     title: 'Item-2', 
     sellerName: 'seller-2', 
     category: 'Cars' 
    }, 
    { 
     itemId: 333333, 
     title: 'Item-3', 
     sellerName: 'seller-3', 
     category: 'Electronics' 
    }, 
    { 
     itemId: 444444, 
     title: 'Item-4', 
     sellerName: 'seller-4', 
     category: 'Cars, Bikes' 
    } 

] 

//Result 
    var result = { 
     Electronics: [ 
      { 
       itemId: 111111, 
       title: 'Item-1', 
       sellerName: 'seller-1' 
      }, 
      { 
       itemId: 333333, 
       title: 'Item-3', 
       sellerName: 'seller-3' 
      } 
     ], 
     Cars: [ 
      { 
       itemId: 222222, 
       title: 'Item-2', 
       sellerName: 'seller-2' 
      }, 
      { 
       itemId: 444444, 
       title: 'Item-4', 
       sellerName: 'seller-4' 
      } 
     ], 
     Bikes: [ 
      { 
       itemId: 444444, 
       title: 'Item-4', 
       sellerName: 'seller-4' 
      } 
     ], 

     Fitness: [ 
      { 
       itemId: 111111, 
       title: 'Item-1', 
       sellerName: 'seller-1' 
      } 
     ] 
    } 

的輸入數組我試過這個代碼,但犯規給我,格式爲確切的結果,我想:

function convertItemsToCategories(items){ 
var categories = {}; 
var itemarr = []; 
for(var i =0; i < items.length; i++){ 
    //categories.push(items[i].category.split(',')); 
    var singleCategory = items[i].category.split(','); 
    //categories[items[i].category] = items[i]; 
    singleCategory.forEach(function(catname){ 
    if(catname == items[i].category) 
    itemarr.push(items[i]); 
    categories[catname] = itemarr; 
    }); 

    console.log(singleCategory); 
} 

console.log(categories); 
} 

convertItemsToCategories(items); 
+1

你的代碼給了你什麼,它與你想要的有什麼不同?我注意到'category'屬性有空白區域,但你只在逗號分割。這可能是問題的一部分嗎? –

回答

1
singleCategory.forEach(function(catname){ 
    if(catname == items[i].category) 
    itemarr.push(items[i]); 
    categories[catname] = itemarr; 
}); 

這部分代碼是不正確的。 catname是由「,」分隔的「類別」,category是原始類別。如果不清除它,你會繼續推送物品itemarr,所以結果很奇怪。

請檢查這個jsfiddle

+0

喜歡解決方案。謝謝。 – neelmeg

0
if(catname == items[i].category) 

不檢查單個單詞的單個單詞。您可以使用RegExp/\s|,/.split()從陣列中刪除空格和,字符,.filter()與參數Boolean刪除可能的空數組項目; Object.hasOwnProperty檢查屬性是否定義在對象上,如果不是在對象上創建屬性,則返回for..in設置屬性和值,不包括category到新對象,.push()對象到數組。

function convertItemsToCategories(items) { 
    var categories = {}; 
    var itemarr = []; 

    for(var i =0; i < items.length; i++){ 
    var currCat = items[i].category.split(/\s|,/).filter(Boolean); 
    for (var j = 0; j < currCat.length; j++) { 
     var obj = {}; 
     if (!categories.hasOwnProperty(currCat[j])) { 
     categories[currCat[j]] = []; 
     } 
     for (var prop in items[j]) { 
     if (prop !== "category") { 
      obj[prop] = items[j][prop] 
     } 
     } 
     categories[currCat[j]].push(obj)  
    } 
    }  
console.log(categories); 
}