Сравните два массива объектов и объедините отсутствующие объекты

У меня есть 2 массива объектов. 1-й это массив менеджеров. 2nd - это массив выбранных менеджеров из первого массива. Разница в том, что я добавил свойство selected: true, Теперь мне нужно заменить менеджеров в первом массиве выбранными менеджерами. Я делаю это с помощью сервиса AngularJS, который я создал. Я уверен, что есть гораздо более простое решение, поэтому я открыт для предложений. JavaScript, jQuery, lodash, LINQ.js хороши. У меня есть поршень, и я показал результат, который мне нужен. Обратите внимание на менеджера, который не имеет selected:true имущество. Скриншот

plunker

var app = angular.module("mainModule", []);
var MainController = function($scope, service) {

var eventUsers = [
  {
    "event_Users_ID":1009,"event_ID":11,"user_ID":"15e640c1-a481-4997-96a7-be2d7b3fcabb"
  },{
    "event_Users_ID":1010,"event_ID":11,"user_ID":"250a19be-e661-4c04-9a50-c84b0e7349b7"
  },{
   "event_Users_ID":1011,"event_ID":11,"user_ID":"4cada7f0-b961-422d-8cfe-4e96c1fc11dd"
  },{
   "event_Users_ID":1013,"event_ID":11,"user_ID":"a3125317-5deb-426d-bbb1-06d3bd4ebaa6"
  }];
 var managers = [
   {
    "id": "15e640c1-a481-4997-96a7-be2d7b3fcabb",
    "fullName": "Kul Srivastva"
   },{
    "id": "250a19be-e661-4c04-9a50-c84b0e7349b7",
    "fullName": "Todd Brothers"
   }, {
    "id": "4cada7f0-b961-422d-8cfe-4e96c1fc11dd",
    "fullName": "Rudy Sanchez"
   }, {
    "id": "79823c6d-de52-4464-aa7e-a15949fb25fb",
    "fullName": "Mike Piehota",
   }, {
    "id": "a3125317-5deb-426d-bbb1-06d3bd4ebaa6",
    "fullName": "Nick Broadhurst"
  }];                

   $scope.result = service.eventUserMatch(eventUsers, managers);
 };

  function service() {
    var vm = this;

    vm.eventUserMatch = function (eventUsers, managers) {
        var arry = [];
        arry = $.map(eventUsers, function (eventUser) {
            var manager = $.grep(managers, function (user) {
                return user.id === eventUser.user_ID;
            })[0];

            eventUser.id = manager.id;
            eventUser.fullName = manager.fullName;
            eventUser.selected = true;
            return eventUser;
        });
        return arry;
    };
 }

app.controller("MainController", MainController);
app.service('service', service);

4 ответа

Решение

Ты можешь использовать Array#map,

// Get all the event user IDs in an array
var eventUserIds = eventUsers.map(e => e.user_ID);

// Iterate over managers
managers = managers.map(e => {
    // If manager is present in the event users, `select` it
    if (eventUserIds.indexOf(e.id) !== -1) {
        e.selected = true;
    }

    return e;
});

var eventUsers = [{
    "event_Users_ID": 1009,
    "event_ID": 11,
    "user_ID": "15e640c1-a481-4997-96a7-be2d7b3fcabb"
}, {
    "event_Users_ID": 1010,
    "event_ID": 11,
    "user_ID": "250a19be-e661-4c04-9a50-c84b0e7349b7"
}, {
    "event_Users_ID": 1011,
    "event_ID": 11,
    "user_ID": "4cada7f0-b961-422d-8cfe-4e96c1fc11dd"
}, {
    "event_Users_ID": 1013,
    "event_ID": 11,
    "user_ID": "a3125317-5deb-426d-bbb1-06d3bd4ebaa6"
}];


var managers = [{
    "id": "15e640c1-a481-4997-96a7-be2d7b3fcabb",
    "fullName": "Kul Srivastva"
}, {
    "id": "250a19be-e661-4c04-9a50-c84b0e7349b7",
    "fullName": "Todd Brothers"
}, {
    "id": "4cada7f0-b961-422d-8cfe-4e96c1fc11dd",
    "fullName": "Rudy Sanchez"
}, {
    "id": "79823c6d-de52-4464-aa7e-a15949fb25fb",
    "fullName": "Mike Piehota",
}, {
    "id": "a3125317-5deb-426d-bbb1-06d3bd4ebaa6",
    "fullName": "Nick Broadhurst"
}];

var eventUserIds = eventUsers.map(e => e.user_ID);
managers = managers.map(e => {
    if (eventUserIds.indexOf(e.id) !== -1) {
        e.selected = true;
    }

    return e;
})

console.log(managers);
document.getElementById('result').innerHTML = JSON.stringify(managers, 0, 4);
<pre id="result"></pre>

Простая реализация:

for(var i = 0; i < eventUsers.length; i++) {    
    for(var j = 0; j < managers.length; j++) {
        if(eventUsers[i].user_ID === managers[j].id) {
            managers[j].selected = true;
        }
    }
}

Как вы сказали, я думаю, что может быть более простой способ сделать это.

Я советую вам взглянуть на SugarJs - библиотеку JavaScript, которая расширяет нативные объекты такими полезными методами. В твоем случае док по массивам.

Для меня это очень помогает в работе с большим количеством нативных объектов JavaScript (JSON).

Это будет работать? Перебрать новый массив менеджеров, найти индекс с помощью lodash соответствующего объекта менеджера в старом массиве менеджеров и заменить его в старом массиве менеджеров менеджером из нового массива менеджеров, если он найден?

Вероятно, есть более эффективный способ написать решение, но, если я правильно понимаю вашу проблему, я считаю, что это должно сработать? Не могу проверить, так как я сейчас на работе.

for(var i=0; i < SelectedManagersArray.length; i++){
    var index = _.findIndex(OldManagersArray, {id: SelectedManagersArray[i].id, fullName: selectedManagersArray[i].fullName);
//I believe lodash returns a -1 if a matching index isn't found.
    if(index !== -1){SelectedManagersArray[index] = OldManagersArray[i]}
    }
Другие вопросы по тегам