簡體   English   中英

如何使用 ES6 從對象數組中刪除重復項?

[英]How to Remove duplicates from an array of objects using ES6?

我想知道合並 2 個對象數組itemsAitemsB的最佳方法是什么。 合並后的數據應該在mergedList

標准:

  1. 帶有source='STAPLE'不應在合並數組中重復。
  2. 具有任何其他來源的項目可能會重復。 例如,項目name: 'Ball'source: 'USER'可能存在兩次。

itemsA有 6 個項目, itemsB有 7 個項目, mergedList應該有 11 個項目

let itemsA = [
{name: 'Milk', source: 'STAPLE'},
{name: 'Bread', source: 'AD'},
{name: 'Egg', source: 'STAPLE'},
{name: 'Ball', source: 'USER'},
{name: 'Pasta', source: 'STAPLE'},
{name: 'Coke', source: 'AD'}];
let itemsB = [
{name: 'Milk', source: 'USER'},
{name: 'Bread', source: 'AD'},
{name: 'Egg', source: 'STAPLE'},
{name: 'Ball', source: 'USER'},
{name: 'Mango', source: 'USER'},
{name: 'Pasta', source: 'STAPLE'},
{name: 'Coke', source: 'USER'}]

mergedList應該等於

let mergedList = [
{name: 'Milk', source: 'STAPLE'},
{name: 'Bread', source: 'AD'},
{name: 'Egg', source: 'STAPLE'},
{name: 'Ball', source: 'USER'},
{name: 'Pasta', source: 'STAPLE'},
{name: 'Coke', source: 'AD'}] 
{name: 'Milk', source: 'USER'},
{name: 'Bread', source: 'AD'},
{name: 'Ball', source: 'USER'},
{name: 'Mango', source: 'USER'},
{name: 'Coke', source: 'USER'}]   ];
function merge(itemsA, itemsB) {
  let merged = [];
  itemsA.concat(itemsB).reduce((stapleSet, obj) => (obj.source != "STAPLE") ?
  (merged.push(obj), stapleSet) : 
  (stapleSet.has(obj.name) || merged.push(obj), 
  stapleSet.add(obj.name), stapleSet), new Set());

  return merged;
}
  • 得到兩個數組。
  • 創建一個合並的數組來推送對象。
  • 將兩個 item 數組連接在一起。
  • 減少連接的數組 - 如果對象源是主食而不是在主食stapleSet ,則將對象的名稱添加到stapleSet集 - 設置對象只允許每個條目中的一個 - 然后將對象推送到merged數組。 否則將對象推送到merged數組。

  • 從函數返回合並后的數組。

 let itemsA = [ {name: 'Milk', source: 'STAPLE'}, {name: 'Bread', source: 'AD'}, {name: 'Egg', source: 'STAPLE'}, {name: 'Ball', source: 'USER'}, {name: 'Pasta', source: 'STAPLE'}, {name: 'Coke', source: 'AD'}]; let itemsB = [ {name: 'Milk', source: 'USER'}, {name: 'Bread', source: 'AD'}, {name: 'Egg', source: 'STAPLE'}, {name: 'Ball', source: 'USER'}, {name: 'Mango', source: 'USER'}, {name: 'Pasta', source: 'STAPLE'}, {name: 'Coke', source: 'USER'}]; function merge(itemsA, itemsB) { let merged = []; itemsA.concat(itemsB).reduce((stapleSet, obj) => (obj.source != "STAPLE") ? (merged.push(obj), stapleSet) : (stapleSet.has(obj.name) || merged.push(obj), stapleSet.add(obj.name), stapleSet), new Set()); return merged; } console.log( merge(itemsA, itemsB) );

編輯:OP的If-Else格式

function merge(itemsA, itemsB) {
  let merged = [];
  itemsA.concat(itemsB).reduce((stapleSet, obj) => {
    if (obj.source != "STAPLE") {
      merged.push(obj);
      return stapleSet;
    } else {
      if (stapleSet.has(obj.name)) {
        return stapleSet;
      } else {
        merged.push(obj);
        stapleSet.add(obj.name);
        return stapleSet;
      }
    }
  }, new Set());
  return merged;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM