Не добавлять не уникальный обьект в массив

148
18 января 2020, 20:40

Есть массив обьектов fruits, из которого, обьекты могут добавляются в массив selected.

let fruits = [{Id: 1, Name: 'Apple'}, {Id: 2, Name: 'Pear'},
{ Id: 3, Name: 'Orange'}, { Id: 4, Name: 'Plum'}, { Id: 5, Name: 'Cherry'}];
let selected = [{Id: 3, Name: 'Orange'}];

Как сделать, чтобы обьекты из fruits не добавлялись в selected, если там уже есть похожий обьект. Например, чтобы в selected больше не добавлялся обьект с Id = 3, а добавились все остальные? Важна поддержка IE.

Answer 1

let fruits = [ 
  { Id: 1, Name: 'Apple' },  
  { Id: 2, Name: 'Pear' }, 
  { Id: 3, Name: 'Orange' },  
  { Id: 4, Name: 'Plum' },  
  { Id: 5, Name: 'Cherry' } 
]; 
let selected = [{Id: 3, Name: 'Orange'}]; 
 
function addUniqueIds(src, dst) { 
  var lookup = {}; 
  for (var i = 0; i < dst.length; i++) { 
    lookup[dst[i].Id] = true; 
  }   
  for (var i = 0; i < src.length; i++) { 
    if (!lookup[src[i].Id]) { 
      lookup[src[i].Id] = true; 
      dst.push(src[i]); 
    } 
  } 
} 
 
addUniqueIds(fruits, selected); 
console.log(selected.length, selected);

Answer 2

А если вдруг кому не так важна поддержка ie, то вот:

1. Если порядок полей не меняется

const fruits = [{Id: 1, Name: 'Apple'}, {Id: 2, Name: 'Pear'}, { Id: 3, Name: 'Orange'}, { Id: 4, Name: 'Plum'}, { Id: 5, Name: 'Cherry'}]; 
 
const selected = [{Id: 3, Name: 'Orange'}]; 
 
const newSelect = selected.map((item) => JSON.stringify(item)); 
 
const result = fruits.reduce((acc, item) => { 
  if(!newSelect.includes(JSON.stringify(item))) { 
    return acc.concat(item); 
  } 
  return acc; 
}, selected) 
 
console.log(result)

2. Если порядок полей меняется (замечание от @n3r0bi0m4n)

const fruits = [{Id: 1, Name: 'Apple'}, {Id: 2, Name: 'Pear'}, { Id: 3, Name: 'Orange'}, { Id: 4, Name: 'Plum'}, { Id: 5, Name: 'Cherry'}]; 
 
const selected = [{Name: 'Orange', Id: 3}, {Name: 'Pear', Id: 2}]; 
 
const newSelect = selected.map((item) => (item.Id)); 
 
const result = fruits.reduce((acc, item) => { 
  if(!newSelect.includes(item.Id)) { 
    return acc.concat(item); 
  } 
  return acc; 
}, selected) 
 
console.log(result)

READ ALSO
Почему mariadb Galera cluster работает медленно?

Почему mariadb Galera cluster работает медленно?

Имеется на данный момент 2 сервера с установленными mariadb В данный момент базы объединены в Galera cluster

168
Как искать сразу несколько разных слов в таблице?

Как искать сразу несколько разных слов в таблице?

Использую redbeanphpПодскажите пожалуйста, вот есть массив данных(разные слова) в переменной dataStrings и нужно найти все совпадения в базе данных...

162
Как в html поместить иконку SVG?

Как в html поместить иконку SVG?

Не отображает иконку SVGЕсли задать bacgkround-image, то иконка отображается (т

188
псевдоклас child

псевдоклас child

применяю псевдоклас child, почему-то значения цвет не применяется: html

177