2016-10-18 15 views
1

私は既に機能しているコードをいくつか持っていますが、オブジェクト構造を変更する必要があります。ここで 変更されたオブジェクトを読み込むためのJavaScript変更コード

は、(元のオブジェクトデータとの)作業コードです:

obj = { 
    "category": [ 
     { 
      "id": "1", 
      "category": "1", 
      "tags": { 
       "483": "tag1", 
       "484": "tag2" 
      } 
     }, 
     { 
      "id": "2", 
      "category": "1", 
      "tags": { 
       "483": "tag1", 
       "484": "tag2" 
      } 
     }, 
     { 
      "id": "3", 
      "category": "2", 
      "tags": { 
       "483": "tag1", 
       "484": "tag2" 
      } 
     }, 
     { 
      "id": "4", 
      "category": "2", 
      "tags": { 
       "483": "tag1", 
       "484": "tag2" 
      } 
     }, 
     { 
      "id": "5", 
      "category": "3", 
      "tags": { 
       "483": "tag1", 
       "484": "tag2" 
      } 
     }, 
    ] 
} 

var results = [ ]; 

for (var i = 0; i < obj.category.length; i++) { 

    $.each(obj.category[i].tags, function(key, value) { 
     results.push(value); 
    }); 

} 

var uniqueNames = []; 
$.each(results, function(i, el){ 
    if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el); 
}); 

console.log(uniqueNames); 
私は今、このような構造のように見えるようにオブジェクトを変更する必要があり

:だから

obj = { 
     "id": "1", 
     "category": "1", 
     "tags": { 
      "483": "tag1", 
      "484": "tag2" 
     } 
    } 

JSFiddle

基本的にカテゴリが取り出されています。

新しいオブジェクト構造を使用するにはどうすればよいですか?

注:コードは、すべてのタグ名が利用可能に取得することになっているし、重複を削除し、最終的に配列

+1

変更唯一のことは、あなたがobj.category' 'をループする必要はありませんであるように見えます。あなた自身で何か試しましたか? –

+0

少なくとも、明確にする:私たちに入力オブジェクトと出力として期待するものを与える –

+0

問題を示すjsfiddleリンクを追加しました –

答えて

0

https://jsfiddle.net/qte5oa9g/8/

$(document).ready(function() { 

    objArr = [ 
     { 
      "id": "1", 
      "category": "1", 
      "tags": { 
       "483": "tag1", 
       "484": "tag2" 
      } 
     }, 
     { 
      "id": "2", 
      "category": "1", 
      "tags": { 
       "483": "tag1", 
       "484": "tag2" 
      } 
     }, 
     { 
      "id": "3", 
      "category": "2", 
      "tags": { 
       "483": "tag1", 
       "484": "tag2" 
      } 
     }, 
     { 
      "id": "4", 
      "category": "2", 
      "tags": { 
       "483": "tag1", 
       "484": "tag2" 
      } 
     }, 
     { 
      "id": "5", 
      "category": "3", 
      "tags": { 
       "483": "tag1", 
       "484": "tag2" 
      } 
     }, 
    ]; 


var results = []; 

for (var i = 0; i < objArr.length; i++) { 

    $.each(objArr, function(key, value) { 
     (value.tags) ? results.push(value) : false; 

    }); 
    console.log(results); 

} 

var uniqueNames = []; 
$.each(results, function(i, el){ 
    if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el); 
}); 

console.log(uniqueNames); 

}); //onready end 

オーケーに結果を追加します。まず第一に、なぜあなたは何らかの理由で合理性を持っているかもしれませんが、オブジェクトのリストを保持しようとすると、「カテゴリ」のようなコンテナを持つか、配列に格納する必要があります。

私の例では、オブジェクトをオブジェクト配列に変更しました。

そこから、array.lengthをチェックして、内部オブジェクトの代わりにオブジェクト配列の代わりにオブジェクト配列をチェックするインデックスを設定するだけです。

Set()というユニークな値を収集するために使用される特定のオブジェクトがあります。それはあなたのuniqueNamesを役に立たなくしてしまったので、完全に削除してSet()として結果を呼び出し、ログに記録しました。

セットにプッシュするのではなく、単に.add(値)メソッドを使用します。私は、配列と同様に、そのためのリファレンスを列挙しました。

ご不明な点がございましたら、お気軽にお問い合わせください。

参考文献:

MDN: Array.prototype

MDN: Set Prototype Add Method

MDN: JavaScript Objects

+0

DOMを使わない関数で '$(document).ready()'を使っているのはなぜですか? – Barmar

+0

@Barmar彼が設定したフィドルのOPのコードの一部です。 – zfrisch

+0

申し訳ありませんが、コンソールに結果はありません。コードは利用可能なすべてのタグ名を取得し、重複を削除して最後に結果を配列に追加する必要があります。 –

関連する問題