2017-12-13 13 views
0

私は比較する必要があるオブジェクト配列を含む配列を持っています。オブジェクトの配列を比較して重複を除去する

私は、複数の類似のスレッドを通して見てきたが、私は、オブジェクトの複数アレイ(大部分がオブジェクトの二つの配列を比較するか、単に単一のアレイ内のオブジェクトを比較している)とを比較し、適切なものを見つけることができませんでした

これは、データ(以下JSFiddleはコードサンプルである)私はの長さに関係なく、オブジェクトのすべての重複配列を除去したい

const data = [ 
    [ 
    { 
     "id": "65", 
     "name": "Some object name", 
     "value": 90 
    }, 
    { 
     "id": "89", 
     "name": "Second Item", 
     "value": 20 
    } 
    ], 
    [ 
    { 
     "id": "89", 
     "name": "Second Item", 
     "value": 20 
    }, 
    { 
     "id": "65", 
     "name": "Some object name", 
     "value": 90 
    } 
    ], 
    [ 
    { 
     "id": "14", 
     "name": "Third one", 
     "value": 10 
    } 
    ] 
] 

あります(さらに多くのレコードがある可能性があります)。

は私がオブジェクトに抽出ユニークなものを得ることができた:私は維持すると返されたデータを配列する重複配列の1を必要とするので、しかし私のために動作しません

const unique = data.reduce(function(result, obj) { 
    return Object.assign(result, obj) 
}, []) 

同様に、オブジェクトの代わりに。例えば:

// result I need 
[ 
    [ 
    { 
     "id":"65", 
     "name":"Some object name", 
     "value":90 
    }, 
    { 
     "id":"89", 
     "name":"Second Item", 
     "value":20 
    } 
    ], 
    [ 
    { 
     "id":"14", 
     "name":"Third one", 
     "value":10 
    } 
    ] 
] 

それでは、どのように私は、親配列内の他の人に各オブジェクトの配列を比較し、各オブジェクトの重複やユニークな配列の1を維持するのですか?

JSFiddle

+0

使用すると、1つまたは複数のアレイで検索している場合は、オブジェクトの複製を検索する概念は、どんなに同じまま。 – Cerbrus

+0

実際にはもっと複雑に見えますが、それ以外の場合は、単純に**複数のオブジェクトを1つの配列にフィルタリングするための何百もの回答に基づいています。リンクした質問にも同じことが起こりますが、このユースケースを満たすことはできません。 – abpetkov

+0

内部配列が順番に見えるため、これがリンクされたものと重複しているかどうかわからないので、比較する前にソートする必要があります。 いくつかのlodash関数--uniqWith'と 'sortBy'を使って解決策をまとめました: https://jsbin.com/terelef/2/edit?js,console – grahamlyons

答えて

0

あなたは以下のfunction.Asを使用してとても達成することができます。そうする最良の最適な方法についてはわからない。

var testArray = [ 
 
    [ 
 
    { 
 
     "id": "65", 
 
     "name": "Some object name", 
 
     "value": 90 
 
    }, 
 
    { 
 
     "id": "89", 
 
     "name": "Second Item", 
 
     "value": 20 
 
    } 
 
    ], 
 
    [ 
 
    { 
 
     "id": "89", 
 
     "name": "Second Item", 
 
     "value": 20 
 
    }, 
 
    { 
 
     "id": "65", 
 
     "name": "Some object name", 
 
     "value": 90 
 
    } 
 
    ], 
 
    [ 
 
    { 
 
     "id": "14", 
 
     "name": "Third one", 
 
     "value": 10 
 
    } 
 
    ] 
 
] 
 

 
function removeDuplicatesFromArray(arr){ 
 

 
var obj={}; 
 
var uniqueArr=[]; 
 
for(var i=0;i<arr.length;i++){ 
 
    if(!obj.hasOwnProperty(arr[i])){ 
 
     obj[arr[i]] = arr[i]; 
 
     uniqueArr.push(arr[i]); 
 
    } 
 
} 
 

 
return uniqueArr; 
 

 
} 
 
var newArr = removeDuplicatesFromArray(testArray); 
 
console.log(newArr);

+0

コードはこの種のものでは動作しませんデータ:https://jsfiddle.net/9xdfdnsy/ 2つの別々の配列の代わりに1つの配列を返します。 – abpetkov

0

const data = [ 
 
    [ 
 
    { 
 
     "id": "65", 
 
     "name": "Some object name", 
 
     "value": 90 
 
    }, 
 
    { 
 
     "id": "89", 
 
     "name": "Second Item", 
 
     "value": 20 
 
    } 
 
    ], 
 
    [ 
 
    { 
 
     "id": "89", 
 
     "name": "Second Item", 
 
     "value": 20 
 
    }, 
 
    { 
 
     "id": "65", 
 
     "name": "Some object name", 
 
     "value": 90 
 
    } 
 
    ], 
 
    [ 
 
    { 
 
     "id": "14", 
 
     "name": "Third one", 
 
     "value": 10 
 
    } 
 
    ] 
 
]; 
 

 
const temp = {}; 
 
const result = []; 
 

 
data.forEach(itemArr => { 
 
    const items = itemArr.filter(item => { 
 
    const isUnique = temp[`${item.id}-${item.name}-${item.value}`] === undefined; 
 
    
 
    temp[`${item.id}-${item.name}-${item.value}`] = true; 
 
    return isUnique; 
 
    }); 
 
    if (items.length !== 0) 
 
    result.push(items); 
 
}); 
 

 
console.log(result);

+0

私が受け入れることができない唯一の理由は、異なるオブジェクトを持つ別の配列がありますが、そのうちの1つがオブジェクトの別の配列から複製されている場合です。 – abpetkov

+0

私はそうは思わない。私はあなたの問題についてはっきりしていないかもしれません。とにかく、@ manikant gautamのソリューションは私が推測するように動作します。 –

+0

まあ、私はこのようなものを意味しました:https://jsfiddle.net/efag61se/結果は、2つのオブジェクトを持つ2つの配列と3つのオブジェクトを持つ1つの配列を持つ必要があります。 – abpetkov

関連する問題