Sireini
Sireini

Reputation: 4262

Compare two arrays with objects and show which item is deleted

I have two arrays which I want to compare and check if there is an deleted item in one of these arrays. If there is show me the difference (deleted item)

Here is the code below how I would like to achieve this:

function compareFilters (a1, a2) {
     var a = [], diff = [];

     for (var i = 0; i < a1.length; i++) {
          a[a1[i]] = true;
     }

     for (var i = 0; i < a2.length; i++) {
        if (a[a2[i]]) {
          delete a[a2[i]];
        } else {
           a[a2[i]] = true;
        }
      }

      for (var k in a) {
        console.log('k', k);
        diff.push(k);
      }

      return diff;
}

console.log(filters);

console.log(filters, queryBuilderFilters, compareFilters(queryBuilderFilters, filters));

This will log both arrays which look like this:

[
 0: {
    id: "AggregatedFields.ReturnOnAdSpend", 
    label: "ROAS (Return on Ad Spend)", 
    type: "integer", 
    description: "The ROAS (Return on Ad Spend)."
},
1: {
    id: "AggregatedFields.ROIExcludingAssisted", 
    label: "ROI excl. assisted", 
    type: "integer", 
    description: "The ROI excluding any assisted values. 
}
]

And the output of the compareFilters function is 0: "[object Object]"

How can I return the label of the object in this function?

Upvotes: 1

Views: 1531

Answers (2)

Achraf
Achraf

Reputation: 1530

This example illustrates what you want

var completedList = [1,2,3,4,7,8];
var invalidList = new Set([3,4,5,6]);
// filter the items from the invalid list, out of the complete list
var validList = completedList.filter((item) => {
  return !invalidList.has(item);
})
console.log(validList); // Print [1,2,7,8]

// get a Set of the distinct, valid items
var validItems = new Set(validList);

Upvotes: 2

Juan Elfers
Juan Elfers

Reputation: 780

You can try this, supposing that the objects in each array have the same reference and are not copies:

function compareFilters (a1, a2) {
    const a1l = a1.length;
    const a2l = a2.length;
    
    // Both arrays are considered to be equal
    if(a1l === a2l) return;
    
    let completed;
    let unCompleted;
    let deletedValue;

    if(a1l > a2l) {
        completed = a1;
        unCompleted = a2;
    } else {
        completed = a2;
        unCompleted = a1;
    }

    for(let i = 0; i < completed.lenth; i++) {
        if(completed[i] !== unCompleted[i]) {
            return completed[i].label;
        }
    }
}

It will return undefined in case both arrays has the same quantity of elements. Otherwise, it will return the label of first element that is in one array but not the another.

Upvotes: 0

Related Questions