0
    var array = [{
  id: "decafc0ffeefacedbabef00ddeadbeef",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef"
}, {
  id: "4bb6ac319db42fabab84826a1c08e8da",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;47421d5c40b2f15d801ac6ca0ff4e6cd;;4bb6ac319db42fabab84826a1c08e8da"
}, {
  id: "4bb6ac319db42fabab84826a1c08e8da",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;4ace8bd1ec354275a813d6e3725047c0;;4bb6ac319db42fabab84826a1c08e8da"
}, {
  id: "47421d5c40b2f15d801ac6ca0ff4e6cd",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;47421d5c40b2f15d801ac6ca0ff4e6cd"
}, {
  id: "4ace8bd1ec354275a813d6e3725047c0",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;4ace8bd1ec354275a813d6e3725047c0"
}];
var keyToBeUnique = 'id';
var newarray = array.filter((val, key) => {
  return !array.slice(key + 1)
    .some((valNew) => {
      if(valNew[keyToBeUnique] === val[keyToBeUnique])
      valNew['long_id'] = val['long_id'] +','+ valNew['long_id'];
      return valNew[keyToBeUnique] === val[keyToBeUnique];
    })
});

console.log(newarray);

Looking for a better way to append the long_Id "valNew['long_id'] = val['long_id'] +','+ valNew['long_id'];" which is written inside "some" function

brooksrelyt
  • 3,925
  • 5
  • 31
  • 54
Adodis
  • 13
  • 3

3 Answers3

0

you can use .map() to extract the ids and a new Set() to remove the duplicates, then remap the resulting array to put back the elements from the original one :

var array = [{
  id: "decafc0ffeefacedbabef00ddeadbeef",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef"
}, {
  id: "4bb6ac319db42fabab84826a1c08e8da",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;47421d5c40b2f15d801ac6ca0ff4e6cd;;4bb6ac319db42fabab84826a1c08e8da"
}, {
  id: "4bb6ac319db42fabab84826a1c08e8da",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;4ace8bd1ec354275a813d6e3725047c0;;4bb6ac319db42fabab84826a1c08e8da"
}, {
  id: "47421d5c40b2f15d801ac6ca0ff4e6cd",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;47421d5c40b2f15d801ac6ca0ff4e6cd"
}, {
  id: "4ace8bd1ec354275a813d6e3725047c0",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;4ace8bd1ec354275a813d6e3725047c0"
}];

const filterArray = (array, key) => {
  const deduped = [...new Set(array.map(e => e[key]))];

  const arr = deduped.map(el => {
    const ndx = array.findIndex(e => e[key] === el);
    return {
      [key]: array[ndx][key],
      long_id: array.filter(e => e[key] === el).map(e => e.long_id).join(';;')
    }
  });

  return arr;
}

console.log(filterArray(array, 'id'))
Taki
  • 17,320
  • 4
  • 26
  • 47
0

you can get your result using reduce, it is simplier to what you want to achieve.

var array = [{
  id: "decafc0ffeefacedbabef00ddeadbeef",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef"
}, {
  id: "4bb6ac319db42fabab84826a1c08e8da",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;47421d5c40b2f15d801ac6ca0ff4e6cd;;4bb6ac319db42fabab84826a1c08e8da"
}, {
  id: "4bb6ac319db42fabab84826a1c08e8da",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;4ace8bd1ec354275a813d6e3725047c0;;4bb6ac319db42fabab84826a1c08e8da"
}, {
  id: "47421d5c40b2f15d801ac6ca0ff4e6cd",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;47421d5c40b2f15d801ac6ca0ff4e6cd"
}, {
  id: "4ace8bd1ec354275a813d6e3725047c0",
  long_id: "1;;decafc0ffeefacedbabef00ddeadbeef;;4ace8bd1ec354275a813d6e3725047c0"
}];


function reducer(array, keyToBeUnique) {
  return array.reduce((accum, cv) => {
    const index = accum.findIndex(item => item[keyToBeUnique] === cv[keyToBeUnique])

    // if the index is -1 it means you dont have that ID yet, then push it.
    if (index === -1) {
      accum.push(cv)
    } else {
      // if it is not -1 you can edit the long_id property and add your strings.
      accum[index]['long_id'] = accum[index]['long_id'] + ', ' + cv['long_id'];
    }
    return accum;


  }, []);
}



console.log(reducer(array, 'id'));
Prince Hernandez
  • 3,623
  • 1
  • 10
  • 19
-1

As suggested here use an array, hope it helps :)

var array = [{
  id: "decafc0ffeefacedbabef00ddeadbeef",
  long_id: ["1;;decafc0ffeefacedbabef00ddeadbeef"]
}, {
  id: "4bb6ac319db42fabab84826a1c08e8da",
  long_id: ["1;;decafc0ffeefacedbabef00ddeadbeef;;47421d5c40b2f15d801ac6ca0ff4e6cd;;4bb6ac319db42fabab84826a1c08e8da"]
}, {
  id: "4bb6ac319db42fabab84826a1c08e8da",
  long_id: ["1;;decafc0ffeefacedbabef00ddeadbeef;;4ace8bd1ec354275a813d6e3725047c0;;4bb6ac319db42fabab84826a1c08e8da"]
}, {
  id: "47421d5c40b2f15d801ac6ca0ff4e6cd",
  long_id: ["1;;decafc0ffeefacedbabef00ddeadbeef;;47421d5c40b2f15d801ac6ca0ff4e6cd"]
}, {
  id: "4ace8bd1ec354275a813d6e3725047c0",
  long_id: ["1;;decafc0ffeefacedbabef00ddeadbeef;;4ace8bd1ec354275a813d6e3725047c0"]
}];

var output = [];

array.forEach(function(item) {
  var existing = output.filter(function(v, i) {
    return v.id == item.id;
  });
  if (existing.length) {
    var existingIndex = output.indexOf(existing[0]);
    output[existingIndex].long_id = output[existingIndex].long_id.concat(item.long_id);
  } else {
    if (typeof item.value == 'string')
      item.long_id = [item.long_id];
    output.push(item);
  }
});

console.dir(output);
Silvio Biasiol
  • 856
  • 8
  • 14