Сравните два массива и подключите его - PullRequest
0 голосов
/ 05 июня 2019

У меня есть два массива как types и defaultTypes. Мне нужно отобразить types с массивом значений по умолчанию defaultTypes.

 const types = [
    {
        Id: 2,
        Name: 'Some value here'
    },
    {
        Id: 3,
        Name: 'Some value here'
    },
    {
        Id: 4,
        Name: 'Some value here'
    }
 ];

 const defaultTypes = [
    {
        Id: 1,
        Name: 'Default value 1'
    },
    {
        Id: 2,
        Name: 'Default value 2'
    }
 ]

Если в types не существует некоторых типов по умолчанию (в этом случае Id: 1 не существует в массиве types). Мне нужно добавить этот объект в массив types. Ожидаемый результат будет:

 const expectedTypes = [
    {
        Id: 1,
        Name: '-'
    },
    {
        Id: 2,
        Name: 'Some value here'
    },
    {
        Id: 3,
        Name: 'Some value here'
    },
    {
        Id: 4,
        Name: 'Some value here'
    }
 ]; 

Объекты с идентификаторами 1 и 2 всегда должны быть в ожидаемых типах.

Ответы [ 5 ]

5 голосов
/ 05 июня 2019
const expectedTypes = types.concat(
  defaultTypes.filter(
    type => !types.some(t => t.Id == type.Id)
  ));

объяснение: в основном вы хотите types + вещи в defaultTypes, которых нет в types уже.

1 голос
/ 05 июня 2019

Попробуйте это:

let types = [{
    Id: 2,
    Name: 'Some value here'
  },
  {
    Id: 3,
    Name: 'Some value here'
  },
  {
    Id: 4,
    Name: 'Some value here'
  }
];

const defaultTypes = [{
    Id: 1,
    Name: 'Default value 1'
  },
  {
    Id: 2,
    Name: 'Default value 2'
  }
];

defaultTypes.forEach(dt => {
  if (!types.some(t => t.Id === dt.Id)) {
    types.push(dt);
  }
});

types = types.sort((a, b) => a.Id - b.Id);
console.log(types);
0 голосов
/ 05 июня 2019

Вы можете уменьшить элементы в требуемом порядке с помощью Map и получить все значения как результат.

const
    types = [{ Id: 2, Name: 'Some value here' }, { Id: 3, Name: 'Some value here' }, { Id: 4, Name: 'Some value here' }],
    defaultTypes = [{ Id: 1, Name: 'Default value 1' }, { Id: 2, Name: 'Default value 2' }],
    result = Array.from([...defaultTypes, ...types]
        .reduce((m, o) => m.set(o.Id, Object.assign({}, m.get(o.Id), o)), new Map)
        .values()
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 05 июня 2019
  • Сначала вы можете создать Set, используя map(), который будет содержать свои элементы в types.
  • Затем переберите defaultTypes и проверьте, содержит ли Set Id. Если нет, то push() это types
  • В конце используйте sort(), чтобы упорядочить элементы по Id

const types = [ { Id: 2, Name: 'Some value here' }, { Id: 3, Name: 'Some value here' }, { Id: 4, Name: 'Some value here' } ]; 
const defaultTypes = [ { Id: 1, Name: 'Default value 1' }, { Id: 2, Name: 'Default value 2' } ]

let ids = new Set(types.map(x => x.Id));

defaultTypes.forEach(x => {
  if(!ids.has(x.Id)) types.push(x)
})
types.sort((a,b) => a.Id - b.Id)
console.log(types)

Назначение Set

Цель Set - сделать лайнер сложности времени O(n). Если вы не используете Set, вам нужно будет использовать some() на types в каждом цикле. Таким образом, сложность времени будет O(m*n)

Set.prototype.has имеет временную сложность O(1)

0 голосов
/ 05 июня 2019

Используйте этот код и попробуйте

var _ = require('lodash');
defaultTypes.forEach(type => {
  if (!_.find(types, { Id: type.Id })) {
    types.push({ Id: type.Id, Name: '-' });
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...