Объединить два массива объектов с пропущенными объектами с одинаковым свойством ID - PullRequest
0 голосов
/ 10 января 2019

Я хочу объединить два массива объектов, но я хочу пропустить объекты с одинаковым идентификатором (я хочу сохранить только первый объект с одинаковым идентификатором).

Один массив хранится локально, а другой я извлекаю пользователей из API.

const localUsers = [
    {
        "id": 1,
        "first_name": "Adam",
        "last_name": "Bent",
        "avatar": "some img url"
    },
    {
        "id": 2,
        "first_name": "New Name",
        "last_name": "New Last Name",
        "avatar": "some new img url"
    }

];

const apiUsers = [
    {
        "id": 2,
        "first_name": "Eve",
        "last_name": "Holt",
        "avatar": "some img url"
    },
    {
        "id": 3,
        "first_name": "Charles",
        "last_name": "Morris",
        "avatar": "some img url"
    }
];

Я ожидаю получить это. Объект в apiUsers с id: 2 пропускается , поскольку он уже существует в массиве объектов localUsers. Я хочу сделать это для всех объектов с одинаковым идентификатором.

const mergedUsers = [
    {
        "id": 1,
        "first_name": "Adam",
        "last_name": "Bent",
        "avatar": "some img url"
    },
    {
        "id": 2,
        "first_name": "New Name",
        "last_name": "New Last Name",
        "avatar": "some new img url"
    },
    {
        "id": 3,
        "first_name": "Charles",
        "last_name": "Morris",
        "avatar": "some img url"
    }

];

Ответы [ 6 ]

0 голосов
/ 10 января 2019

Сначала удалите все экземпляры из apiUsers, которые существуют в localUsers, затем добавьте этот массив в localUsers. Порядок массива здесь не имеет значения, как указано в вопросе, но его легко выполнить.

const filteredApiUsers = apiUsers.filter(x => !localUsers.some(y => x.id === y.id));
const mergedUsers = [...localUsers, ...filteredApiUsers];
0 голосов
/ 10 января 2019

Достаточно просто написать собственную функцию сравнения:


    for(var i=0; i<localUsers.length; ++i) {
        var checked = 0;
        for(var j=i+1; j<apiUsers.length; ++j) {
             if(localUsers[i]['id'] === apiUsers[j]['id']){
                  apiUsers.splice(j--, 1);
             }
        }
    }
    console.log(localUsers.concat(apiUsers));

0 голосов
/ 10 января 2019

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

const
    localUsers = [{ id: 1, first_name: "Adam", last_name: "Bent", avatar: "some img url" }, { id: 2, first_name: "New Name", last_name: "New Last Name", avatar: "some new img url" }],
    apiUsers = [{ id: 2, first_name: "Eve", last_name: "Holt", avatar: "some img url" }, { id: 3, first_name: "Charles", last_name: "Morris", avatar: "some img url" }],
    result = Array.from(
        [localUsers, apiUsers]
            .reduce(
                (m, a) => a.reduce((n, o) => n.set(o.id, n.get(o.id) || o), m),
                new Map
            )
            .values()
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 10 января 2019
  1. Отфильтруйте пользователей из apiUserArray, которые уже находятся в localUserArray.
  2. Объединить оба массива.

    let distinctApiUsers = apiUsers
                            .filter(rUser => localUsers
                                              .findIndex(lUser => lUser.id == rUser.id) == -1)
    
    let mergedArray = localUsers.concat(distinctApiUsers)
    
0 голосов
/ 10 января 2019

Создайте свои mergedUsers объединяющие localUsers и apiUsers, которых уже нет в localUsers:

const localUsers = [
    {
        "id": 1,
        "first_name": "Adam",
        "last_name": "Bent",
        "avatar": "some img url"
    },
    {
        "id": 2,
        "first_name": "New Name",
        "last_name": "New Last Name",
        "avatar": "some new img url"
    }

];

const apiUsers = [
    {
        "id": 2,
        "first_name": "Eve",
        "last_name": "Holt",
        "avatar": "some img url"
    },
    {
        "id": 3,
        "first_name": "Charles",
        "last_name": "Morris",
        "avatar": "some img url"
    }
];

const mergedUsers = localUsers.concat(apiUsers.filter(a => !localUsers.find(b => b.id === a.id)));
console.log(mergedUsers);
0 голосов
/ 10 января 2019

вы можете использовать это для объединения двух объектов с дубликатами:

Array.prototype.push.apply(localUsers,apiUsers);

тогда вы можете удалить дубликаты с новым объектом.

ссылка: Слияние 2 массивов объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...