找回密码
 立即注册
问题
我有这样的数据:
  1. let objData = [{
  2.     "product_client_id": 24,
  3.     "product_type": "VIRTUAL"
  4. }, {
  5.     "product_client_id": 24,
  6.     "product_type": "VIRTUAL"
  7. }, {
  8.     "product_client_id": 86,
  9.     "product_type": "VIRTUAL"
  10. }, {
  11.     "product_client_id": 86,
  12.     "product_type": "PHYSIC"
  13. }, {
  14.     "product_client_id": 24,
  15.     "product_type": "PHYSIC"
  16. }];
复制代码

目标是在数组中搜索相同的重复对象,根据product_client_id和product_type过滤,从上面的数据中我想要输出如下
  1. [
  2.   {
  3.     "product_client_id": 24,
  4.     "product_type": "VIRTUAL"
  5.   }
  6. ]
复制代码

因为只有上面的数据按product_client_id和product_type和数组中的其他对象是一样的

回答
最直接的解决方案是遍历每个对象并检查是否存在“相似”对象。数组中的对象。

例如:
  1. let dupIdx = [];
  2. let final = objData.reduce(function(acc1, obj1, idx1) {
  3.     // Don't look at objects already known as dups
  4.     // This is so we don't introduce dups into the final result
  5.     if (dupIdx.indexOf(idx1) === -1)
  6.         let dups = objData.reduce(function (acc2, obj2, idx2) {
  7.             // Same index or same property values.
  8.             if (idx1 === idx2 ||
  9.                 (obj1.product_client_id === obj2.product_client_id &&
  10.                 obj1.product_type === obj2.product_type)) {
  11.                 acc2.push(idx2)
  12.             }
  13.             return acc2;
  14.         }, []);

  15.         if (dups.length > 1) {
  16.            // Add new prop
  17.            obj1.index = dups;
  18.            acc1.push(obj1);
  19.            // Update dup list
  20.            dupIdx = dupIdx.concat(dups);
  21.         }
  22.     }

  23.     return acc1;
  24. }, []);
复制代码

但是请注意,对于较大的数组,这将非常低效,因为它是 O(n^2)





上一篇:引用 - 这个符号在 PHP 中是什么意思?
下一篇:打印堆栈指针的值