比较2个数组值仅推送第一个结果

时间:2017-12-27 14:53:48

标签: javascript ecmascript-5

我有一个数组,我需要比较它的值 - 如果有重复 - 我想将它们存储在数组中,例如:

 obj1 = [{"manager_id":1,"name":"john"},{"manager_id":1,"name":"kile"},
 {"manager_id":2,"name":"kenny"},
 {"manager_id":4,"name":"stan"}]

 obj2 = [{"employees_id":1,"name":"dan"},
 {"employees_id":1,"name":"ben"},{"employees_id":1,"name":"sarah"},
 {"employees_id":2,"name":"kelly"}]

如果" manger_id" ===" employees_id - 然后结果将是:

 // {1:[{"manager_id":1,"name":"john"},{"manager_id":1,"name":"kile"},
    {"employees_id":1,"name":"dan"}, {"employees_id":1,"name":"ben"},
    {"employees_id":1,"name":"sarah"}]};

我试过了:



var obj1 = [{
  "manager_id": 1,
  "name": "john"
}, {
  "manager_id": 1,
  "name": "kile"
}, {
  "manager_id": 2,
  "name": "kenny"
}, {
  "manager_id": 4,
  "name": "stan"
}];

var obj2 = [{
  "employees_id": 1,
  "name": "dan"
}, {
  "employees_id": 1,
  "name": "ben"
}, {
  "employees_id": 1,
  "name": "sarah"
}, {
  "employees_id": 2,
  "name": "kelly"
}];

var res = obj1.concat(obj2).reduce(function(r, o) {

  r[o.manager_id] = r[o.employees_id] || [];
  r[o.manager_id].push(o);


  return r;
}, {});


console.log(res);

.as-console-wrapper {
  max-height: 100% !important;
  top: 0;
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div></div>
&#13;
&#13;
&#13;

你可以得到&#34; manager_id&#34;的结果。没有添加 - 只有一个 - 应该有更多

如果manager_id === employees_id //应该在第一个键中输出

{1:[{"manager_id":1,"name":"john"},{"manager_id":1,"name":"kile"},
    {"employees_id":1,"name":"dan"}, {"employees_id":1,"name":"ben"},
    {"employees_id":1,"name":"sarah"}]}; 

正如您所看到的,有几个常见的内容

2 个答案:

答案 0 :(得分:3)

r[o.manager_id] = r[o.employees_id] || [];在此语句中,如果经理没有employee_id,则正在为该ID重置数组。

正确的做法是:

var res = obj1.concat(obj2).reduce(function(r, o) {
  var id;
  if(o.hasOwnProperty('manager_id')) {
    id = o['manager_id'];
  }
  else {
    id = o['employees_id'];
  }

  r[id] = r[id] || [];
  r[id].push(o);

  return r;
}, {});

答案 1 :(得分:2)

问题依赖于这一行:

r[o.manager_id] = r[o.employees_id] || [];

您应该记住,数组中的某些对象具有manager_id而其他对象没有,但它们具有employees_id,因此您必须先使用此行评估该对象:< / p>

var itemId = o.manager_id || o.employees_id;

试试这段代码:

var res = obj1.concat(obj2).reduce(function(r, o) {
  var itemId = o.manager_id || o.employees_id;
  r[itemId] = r[itemId] || [];
  r[itemId].push(o);


  return r;
}, {});