2016-06-15 85 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); 
}