-3

I would like to read array2 and remove items from array1 and add new item to array1:

If parameter "Removed" is 1 then i want to remove this item. If parameter "Removed" is 0 then i want to add item.

How can I make the following solution using javascript?

I have two arrays:

var array1 = [
{ItemId: "1", Name: "John"},
{ItemId: "2", Name: "George"}, 
{ItemId: "3", Name: "Peter"}
]

and

var array2 = [
{ItemId: "1", Name: "John", Removed: "1"},
{ItemId: "4", Name: "Mario", Removed: "0"}, 
{ItemId: "5", Name: "Mike", Removed: "0"}
]

I want following result:

var array1 = [
    {ItemId: "2", Name: "George"}, 
    {ItemId: "3", Name: "Peter"},
    {ItemId: "4", Name: "Mario"}, 
    {ItemId: "5", Name: "Mike"}
    ]
Veger
  • 37,240
  • 11
  • 105
  • 116
Jenan
  • 3,408
  • 13
  • 62
  • 105

2 Answers2

2

Try this:

Note: This doesn't do any checks for duplicate entries with same "Name" or same "ItemId". You may want to do that also.

var array1 = [
    {ItemId: "1", Name: "John"},
    {ItemId: "2", Name: "George"}, 
    {ItemId: "3", Name: "Peter"}
];

var array2 = [
    {ItemId: "1", Name: "John", Removed: "1"},
    {ItemId: "4", Name: "Mario", Removed: "0"}, 
    {ItemId: "5", Name: "Mike", Removed: "0"}
];

for(var i = 0; i < array2.length; i++) {
    if(array2[i]["Removed"] == "1") {
        // Remove elements
        for(var j = 0; j < array1.length; j++) {
            if(array1[j]["Name"] == array2[i]["Name"]) {
                array1.splice(j,1);
            }
        }
    } else {
        item = {};
        item["ItemId"] = array2[i]["ItemId"];
        item["Name"] = array2[i]["Name"];
        array1.push(item);
    }
}
ATOzTOA
  • 34,814
  • 22
  • 96
  • 117
  • Your inner `for` loop will skip an index every time you do a `.splice()`. Not an issue if there's only one of each user in the Array though. Still a good idea to decrement `j`, just to be safe. – the system Feb 23 '13 at 16:39
-1

Using Object.equals() from https://stackoverflow.com/a/1144249/1922787:

function mergeArrays(array, operations) {
  var obj;
  var removed;

  for (var i = 0; i < operations.length; i++) {
    obj = operations[i];
    removed = obj.Removed;
    delete obj.Removed;

    if (removed === '0') { array.push(obj); }
    if (removed === '1') { array = removeObjFromArray(array, obj); }
  }

  return array;
}

function removeObjFromArray(array, obj) {
  for (var i = 0; i < array.length; i++) {
    if (obj.equals(array[i])) {
      array.splice(i, 1);
      break; // assuming you don't have dupplicated objects in your array
    }
  }

  return array;
}

array1 = mergeArrays(array1, array2);
Community
  • 1
  • 1
Vincent Simard
  • 524
  • 3
  • 8