Home > Blockchain >  NODEJS - Prevent duplicate keys from being added into an object array
NODEJS - Prevent duplicate keys from being added into an object array

Time:12-06

I have a function I am trying to use to not add duplicates (Later on will combine)

function arrayCombine(arrayOfValues, arrayOfValues2) {
    for (var arrName in arrayOfValues2) {
        if (arrayOfValues.indexOf(arrName)==-1) arrayOfValues.push([arrName, arrayOfValues2[arrName]]);
    }
    return arrayOfValues;
}

The arrays are lets say:

arrayOfValues
[
  [ 'test', 11 ],
  [ 'test2', 13 ],
  [ 'test3', 16 ],
]

arrayOfValues2
[
  [ 'test4', 12 ],
  [ 'test2', 25 ],
]

When I try to combine these, it does NOT remove the duplicate test2 here. It pushes it anyways.

This does not occur if the number does not exist so I assume when I'm checking for INDEXOF, there has to be a way to check for only the named value and not the numbered value too. What I mean is:

function arrayCombine(arrayOfValues, arrayOfValues2) {
    for (var arrName in arrayOfValues2) {
        if (arrayOfValues.indexOf(arrName)==-1) arrayOfValues.push(arrName);
    }
    return arrayOfValues;
}

Did work originally.

How can I have it only 'check' the name? In the future I will also combine but for now I just want to make sure no duplicate names get added.

CodePudding user response:

Since objects only allow unique keys it may be simpler to use one to collate your data from both arrays. By concatenating the arrays, and then reducing over them to create an object, you can add/combine each nested arrays values as you see fit. Then, to get an array back from the function use Object.values on the object.

const arr1=[["test",11],["test2",13],["test3",16]],arr2=[["test4",12],["test2",25]];

// Accepts the arrays
function merge(arr1, arr2) {

  // Concatentate the arrays, and reduce over that array
  const obj = arr1.concat(arr2).reduce((acc, c) => {

    // Destructure the "key" and "value" from the
    // nested array
    const [ key, value ] = c;

    // If the "key" doesn't exist on the object
    // create it and assign an array to it, setting
    // the second element to zero
    acc[key] ??= [ key, 0 ];

    // Increment that element with the value
    acc[key][1]  = value;

    // Return the accumulator for the next iteration
    return acc;

  }, {});

  // Finally return only the values of the object
  // which will be an array of arrays
  return Object.values(obj);

}

console.log(merge(arr1, arr2));

Additional documentation

  • Related