0

I have an array:

var objects = [
    {product:'123', options:{cap:'', fort:'', count:1}},
    {product:'123', options:{cap:'', fort:'', count:1}},
    {product:'12', options:{cap:'', fort:'', count:1}},
    {product:'1234', options:{cap:'123', fort:'', count:1}},
    {product:'1234', options:{cap:'', fort:'', count:1}}
];

I need to filter this array in this way:

(product === product && options !== options) || (product !== product && options == options)

It means that the array should looks like:

var objects = [
    {product:'123', options:{cap:'', fort:'', count:1}},
    {product:'1234', options:{cap:'123', fort:'', count:1}},
    {product:'12', options:{cap:'', fort:'', count:1}},
    {product:'1234', options:{cap:'', fort:'', count:1}}
];
M0nst3R
  • 5,186
  • 1
  • 23
  • 36

1 Answers1

0

Try this (not so efficient but simple) approach

objects.map((s)=> JSON.stringify(s)).filter( (s,i,a)=> a.indexOf(s,i+1) == -1 ).map((s)=> JSON.parse(s));

Demo

var objects = [
{product:'123', options:{cap:'', fort:'', count:1}},
{product:'123', options:{cap:'', fort:'', count:1}},
{product:'12', options:{cap:'', fort:'', count:1}},
{product:'1234', options:{cap:'123', fort:'', count:1}},
{product:'1234', options:{cap:'', fort:'', count:1}}
];

objects = objects.map((s)=> JSON.stringify(s)).filter( (s,i,a)=> a.indexOf(s,i+1) == -1 ).map((s)=> JSON.parse(s));

console.log( objects );

Explanation

  • Convert all items to their string version using JSON.stringify
  • Remove duplicates
  • Parse them back to Objects

Note This answer won't work if your objects' keys are not in same order and any function values in the object will be removed after stringify and parse.

gurvinder372
  • 66,980
  • 10
  • 72
  • 94