Rauf
Rauf

Reputation: 57

Multidimensional array comparison in Javascript

My input is

let data  = [
       [1,2,3],
       [1,3,2,4],
       [3,2,1,5],
       [1,2,3],
       [3,2,1]
    ];

after this peace of code:

var dataUnique = data.reduce(function (out, item) {
    return out.concat(out.filter(function (comp) {
      return item.toString() == comp.toString();
    }).length ? [] : [item])
  }, []);
  console.log(data, dataUnique);

Output give me array of 4 element

   [1,2,3],
   [1,3,2,4],
   [3,2,1,5],
   [3,2,1]

but expected output would be

 [1,2,3],
   [1,3,2,4],
   [3,2,1,5]

Can anyone suggest any solution. Thanks.

Upvotes: 0

Views: 47

Answers (2)

Ele
Ele

Reputation: 33726

This is an alternative using the functions reduce, every and includes.

Basically, this approach checks if one number doesn't exist within the previously checked arrays.

let data = [  [1, 2, 3],  [1, 3, 2, 4],  [3, 2, 1, 5],  [1, 2, 3],  [3, 2, 1]],
    result = data.reduce((a, c) => {
      c.forEach(n => {
        if (a.length == 0 || !a.every(arr => arr.includes(n))) a.push(c);
      });
      return a;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 0

Mark
Mark

Reputation: 92440

You can create some sort of hash — on object, Map, Set, etc and use a stringified version of your input as keys. Here's an example using a Set:

let data  = [
    [1,2,3],
    [1,3,2,4],
    [3,2,1,5],
    [1,2,3],
    [3,2,1]
 ];

let set = new Set()
let result = data.reduce((a, i) => {
    let k = i.concat().sort().join('_')
    if (!set.has(k)) {
        set.add(k)
        a.push(i)
    }
    return a
}, [])

console.log(result)

This could be a little simpler if you didn't mind the output having sorted versions of your input.

Upvotes: 1

Related Questions