2016-06-15 16 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' 
      } 
     ] 
    } 

入力配列が、私はこのコードを試してみましたが、私が欲しいの形式で私に正確な結果を与えるdoesntの:

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) 

シングルワードの場合はチェックされません。 /\s|,/.split()に設定すると、配列から空白と,文字を削除し、のパラメータをBooleanとすると、空の配列アイテムを削除できます。 オブジェクトにプロパティが定義されているかどうかをチェックし、オブジェクトにプロパティを作成していない場合は、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); 
} 
関連する問題