合并长度、键和值都不同的两个对象

4

我有两个长度不同的对象,我想根据'mac_id'进行合并。我之前使用lodash的_.merge()方法,但它不支持变量长度的对象。

obj4=[ 
  { mac_id: '00-17-0d-00-00-30-47-fa',
    sent_mail_time: '2017-09-28 11:07:0' },
  { mac_id: '00-17-0d-00-00-30-48-18',
    sent_mail_time: '2017-09-28 11:07' }
    ];

obj3=[ 
  { mac_id: '00-17-0d-00-00-30-4d-94',
    notif_time: '2017-09-28 10:16:28' },
  { mac_id: '00-17-0d-00-00-30-47-fa',
    notif_time: '2017-09-28 10:14:28' },
  { mac_id: '00-17-0d-00-00-30-49-58',
    notif_time: '2017-09-28 10:26:28' } ]

使用_.groupBy('mac_id')我得到了所需的数据,但并不是以结构化的方式呈现。

我需要遵循哪些方法才能使最终结果像这样呈现?

[ 
      { mac_id: '00-17-0d-00-00-30-4d-94',
        notif_time: '2017-09-28 10:16:28' },
      { mac_id: '00-17-0d-00-00-30-47-fa',
        sent_mail_time: '2017-09-28 11:07:0',
        notif_time: '2017-09-28 10:14:28' },
      { mac_id: '00-17-0d-00-00-30-49-58',
        notif_time: '2017-09-28 10:26:28' },
        { mac_id: '00-17-0d-00-00-30-48-18',
        sent_mail_time: '2017-09-28 11:07' } ]

项目的顺序很重要吗? - floriangosse
你的意思是合并两个数组吗? - alen
@floriangisse 不,排列的顺序并不重要。 - SamForiYana
只有 obj4 和 obj3 中对应的 mac_ids 才能与 obj4 和 obj3 的键值对中的任一组匹配。 - SamForiYana
4个回答

3
您可以使用Object.assign():
var _ = require('lodash');

let obj4=[
    { mac_id: '00-17-0d-00-00-30-47-fa',
        sent_mail_time: '2017-09-28 11:07:0' },
    { mac_id: '00-17-0d-00-00-30-48-18',
        sent_mail_time: '2017-09-28 11:07' }
];

let obj3=[
    { mac_id: '00-17-0d-00-00-30-4d-94',
        notif_time: '2017-09-28 10:16:28' },
    { mac_id: '00-17-0d-00-00-30-47-fa',
        notif_time: '2017-09-28 10:14:28' },
    { mac_id: '00-17-0d-00-00-30-49-58',
        notif_time: '2017-09-28 10:26:28' } ];


obj3.forEach(obj3Child => {
    let objtToMerge;
    if (!(objtToMerge = _.find(obj4,function (obj4Child) { return obj4Child.mac_id === obj3Child.mac_id; }))) {
        obj4.push(obj3Child);
    } else {
        Object.assign(objtToMerge, obj3Child);
    }
});

console.log(obj4);

2
您可以按照以下方式进行操作:

obj4=[ 
      { mac_id: '00-17-0d-00-00-30-47-fa',
        sent_mail_time: '2017-09-28 11:07:0' },
      { mac_id: '00-17-0d-00-00-30-48-18',
        sent_mail_time: '2017-09-28 11:07' }
     ];

obj3=[ 
      { mac_id: '00-17-0d-00-00-30-4d-94',
         notif_time: '2017-09-28 10:16:28' },
      { mac_id: '00-17-0d-00-00-30-47-fa',
         notif_time: '2017-09-28 10:14:28' },
      { mac_id: '00-17-0d-00-00-30-49-58',
         notif_time: '2017-09-28 10:26:28' }
   ];
   
let result= _u.groupBy(obj4.concat(obj3), 'mac_id');

result = Object.keys(result).map(e => Object.assign({}, ...result[e]));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"></script>
<script>
_u = _.noConflict(); // lets call ourselves _u
</script>


谢谢@marvel308,它正在工作,请问您能否解释一下.map(...)和...result[e]的含义? - SamForiYana

0

另一种方式

// merge objs
merged = obj3.concat(obj4).map( (item,index,arr) => {
    let duplicates = arr.filter( v => v.mac_id == item.mac_id  )
    return Object.assign(...duplicates)
})

// remove duplicates
merged =  [...new Set(merged)] 
console.log(merged) 

0
这里有一个不使用 lodash 的解决方案。由于库不一定总是可用,因此这是一个完整的解决方案。

var obj4=[ 
 { mac_id: '00-17-0d-00-00-30-47-fa',
  sent_mail_time: '2017-09-28 11:07:0' },
 { mac_id: '00-17-0d-00-00-30-48-18',
  sent_mail_time: '2017-09-28 11:07' }
];

var obj3=[ 
 { mac_id: '00-17-0d-00-00-30-4d-94',
  notif_time: '2017-09-28 10:16:28' },
 { mac_id: '00-17-0d-00-00-30-47-fa',
  notif_time: '2017-09-28 10:14:28' },
 { mac_id: '00-17-0d-00-00-30-49-58',
  notif_time: '2017-09-28 10:26:28' } ]

var reducer = function(obj1, obj2) {
 return obj1.reduce( (i, j) => {
  var temp = obj2.filter( o => o.mac_id == j.mac_id);
  i.push(temp == []? j: Object.assign({}, j, temp[0]) );
  return i;
 }, []);
};

function removeDuplicates(originalArray, prop) {
 // https://dev59.com/U3E95IYBdhLWcg3wp_kg#38595329
 var newArray = [];
 var lookupObject  = {};

 for(var i in originalArray) {
  lookupObject[originalArray[i][prop]] = originalArray[i];
 }

 for(i in lookupObject) {
  newArray.push(lookupObject[i]);
 }
 return newArray;
}

var v1 = reducer(obj3, obj4);
var v2 = reducer(obj4, obj3);

console.log(removeDuplicates([...v1, ...v2], "mac_id"));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接