2016-07-27 5 views
-1

以下の2つのプロパティに基づいて、配列から一意のオブジェクトを見つける必要があります。 "クラス"と "運賃"が一致する場合、私は一意の値を取り出して結果配列に入れなければなりません。javascript - 複数のプロパティに基づいて配列内の一意のオブジェクトを見つける

出典:

var arr = [{class:"second", fare: "a"}, 
{class:"second", fare: "b"}, 
{class:"first", fare: "a"}, 
{class:"first", fare: "a"}, 
{class:"second", fare: "a"}, 
{class:"first", fare: "c"} 
] 

期待される結果:

var result = [{class:"second", fare: "a"}, 
{class:"second", fare: "b"}, 
{class:"first", fare: "a"}, 
{class:"first", fare: "c"} 
] 

私はSOにオーバー見て、一つの特性(Create array of unique objects by property)に基づいてフィルタリングされ、答えを見つけることができたが、見つけることができませんでした2つの特性に基づいて行うことができる。

+1

に存在する場合、私はもっとあるだろうと思う見つけるために、ループとfilterまたはfind配列プロパティへforEachを使用することができますあなたがソルティオであなた自身の試みを示したなら、助けてくれる意欲n。あなたは*オンラインからの回答を取る必要はありません。オブジェクトキーのアクセスについての熟知した知識に基づく長年の解決策でさえ、重要な部分について考えさせるかもしれません。 – Katana314

+0

'class'はES6予約語です。 'kind'、 'type'などを使用してください。 – alex030293

+0

@ Katana314 - うーん、私はいくつかのことを試みましたが、結局そのコードを削除しました。とにかく、そのポーズを試みます。 – whyAto8

答えて

3

ハッシュテーブルの結合キーを作成して、指定された配列をフィルタすることができます。

var arr = [{ class: "second", fare: "a" }, { class: "second", fare: "b" }, { class: "first", fare: "a" }, { class: "first", fare: "a" }, { class: "second", fare: "a" }, { class: "first", fare: "c" }], 
 
    result = arr.filter(function (a) { 
 
     var key = a.class + '|' + a.fare; 
 
     if (!this[key]) { 
 
      this[key] = true; 
 
      return true; 
 
     } 
 
    }, Object.create(null)); 
 

 
console.log(result);

+0

ありがとう、私はこれを試してみましょう。 – whyAto8

+0

パーフェクト、うまくいきました。どうもありがとう。 – whyAto8

+0

ちょっと疑問ですが、なぜここに「Object.create(null)」が必要ですか? – whyAto8

0

あなたは、要素が配列

var arr = [{ 
     class: "second", 
     fare: "a" 
    }, { 
     class: "second", 
     fare: "b" 
    }, { 
     class: "first", 
     fare: "a" 
    }, { 
     class: "first", 
     fare: "a" 
    }, { 
     class: "second", 
     fare: "a" 
    }, { 
     class: "first", 
     fare: "c" 
    }] 
    var _unArray = []; // new array without duplicate 
    arr.forEach(function(item) { // loop through array which contain duplicate 
     // if item is not found in _unArray it will return empty array 
     var isPresent = _unArray.filter(function(elem) { 
     return elem.class === item.class && elem.fare === item.fare 
     }) 
     if (isPresent.length == 0) { 
     _unArray.push(item) 
     } 
    }) 
    console.log(_unArray) 

JSFIDDLE

+0

解決策がプロパティ 'class'と' fare'をそれに焼き付けたのは不満です。 –

関連する問題