比较两个对象数组并组合缺少的对象

时间:2016-01-29 13:39:02

标签: javascript jquery angularjs lodash linq.js

我有2个对象数组。第一个是一系列经理人。第二个是来自第一个阵列的选定管理器的数组。不同之处在于我添加了一个属性selected: true。我现在需要用选定的管理器替换第一个数组中的管理器。我正在使用我创建的AngularJS服务执行此操作。我确信有更简单的解决方案,所以我愿意接受建议。 JavaScript,jQuery,lodash,LINQ.js都很棒。 我有一个plunker,我已经显示了我需要的结果。请注意没有selected:true属性的经理。 screenshot

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 个答案:

答案 0 :(得分:2)

您可以使用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>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

正如你所说,我认为可能有更简单的方法来做到这一点。

我建议你选择SugarJs这是一个JavaScript库,它使用非常有用的方法扩展本机对象。 在您的情况下,Arrays上的文档。

对我来说,它有很多处理大量原生JavaScript对象(JSON)的帮助。

答案 2 :(得分:1)

这会有用吗?循环遍历新的管理器数组,使用旧管理器数组中匹配的管理器对象的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]}
    }

答案 3 :(得分:1)

简单实施:

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;
        }
    }
}