Search code examples
distinctjslinq

JSLINQ - Distinct from multiple columns


I have a working JSFiddle demo https://jsfiddle.net/u1fohjxw/

The idea is to create a unique list of items, based on multiple fields. I know the way I've implemented it could be improved, but need advice on doing it in JSLINQ.

This filtered unique list I then manually loop and add again - this could be done in JSLINQ.

Please indicate how this should be done :

var myList = [
            {FirstName:"Chris",LastName:"Pearson"},
            {FirstName:"Chris",LastName:"Pearson"},
            {FirstName:"Chris",LastName:"Sutherland"},
            {FirstName:"John",LastName:"Ronald"},
            {FirstName:"Steve",LastName:"Pinkerton"}
            ];


var exampleArray = JSLINQ(myList)
                                    .Distinct(function(item){ return item.FirstName.concat(";",item.LastName)}).items

var newList = [];     

 for (var x = 0 ; x < exampleArray.length ; x++) {
      var arraylist = exampleArray[x].split(";");
      var y= new Object();
     y.FirstName = arraylist[0];
     y.LastName = arraylist[1];
     newList.push(y);
  };                 

Solution

  • how you doing? :)

    Maybe something like this helps you out:

    var myList = [
                {FirstName:"Chris",LastName:"Pearson"},
                {FirstName:"Chris",LastName:"Pearson"},
                {FirstName:"Chris",LastName:"Sutherland"},
                {FirstName:"John",LastName:"Ronald"},
                {FirstName:"Steve",LastName:"Pinkerton"}
                ];
    
    var resultList = myList.Distinct(function(x){
                                        return {
                                            FirstName: x.FirstName,
                                            LastName: x.LastName
                                        }
                                    }).ToArray();
    

    This will return an array of the object returned inside the distinct.

    Edit:

    Change the distinct method to this:

    Distinct: function(clause) { 
            var item, dict = {}, retVal = [];
            for (var i = 0; i < this.items.length; i++) {
                item = clause.apply(this.items[i], [this.items[i]]); 
                if (dict[JSON.stringify(item)] === undefined) {
                    dict[JSON.stringify(item)] = true;
                    retVal.push(item);
                }
            }
            dict = null;
            return JSLINQ(retVal);
        },
    

    It's not stress tested, I don't know how much time will take to iterate through 10k+ objects, but it's something to study and improve! :)

    There's another possible fix to this if you want to try.

    Cheers!