簡體   English   中英

從對象數組中刪除相同的值

[英]Remove same Values from array of Object

我想通過比較 2 個數組從數組中刪除相同的對象。

樣本數據:

arr1 = [
  {id: 1, name: "a"},
  {id: 2, name: "b"},
  {id: 3, name: "c"},
  {id: 4, name: "d"},
];

arr2 = [
  {id: 1, name: "a"},
  {id: 4, name: "d"},
];

let newArray = []; // new array with with no same values it should be unique.
arr1.map((val, i)=>{
   arr2.map((val2)=>{
    if(val.id == val2.id){
       console.log('Matched At: '+ i) // do nothing
    }else{
      newArray.push(val);
    }
   })
})
console.log(newArray); // e.g: [{id: 2, name: "b"}, {id: 3, name: "c"},];

Array.filter與 not Array.some結合使用。

這里的訣竅也不是some ,..

 const arr1 = [ {id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "c"}, {id: 4, name: "d"}, ], arr2 = [ {id: 1, name: "a"}, {id: 4, name: "d"}, ]; const newArray=arr1.filter(a=>!arr2.some(s=>s.id===a.id)); console.log(newArray);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

正如評論中提到的,這個問題的解釋可能略有不同。 如果您還想要來自 arr2 的 unqiue 項目,您基本上只需執行兩次並加入。 IOW:檢查 arr2 中沒有的內容在 arr1 中,然后檢查 arr1 中沒有的內容在 arr2 中。

例如..

const notIn=(a,b)=>a.filter(f=>!b.some(s=>f.id===s.id));
const newArray=[...notIn(arr1, arr2), ...notIn(arr2, arr1)];

更新 2:時間復雜度,正如 qiAlex 所提到的,循環中存在循環。 雖然some會在尋找匹配時短路,但如果數據集變大,事情可能會變慢。 這是SetMap進來的。

所以要使用Set解決這個問題。

const notIn=(a,b)=>a.filter(a=>!b.has(a.id));
const newArray=[
  ...notIn(arr1, new Set(arr2.map(m=>m.id))),
  ...notIn(arr2, new Set(arr1.map(m=>m.id)))
];
const isInArray = (arr, id, name) => arr.reduce((result, curr) => ((curr.name === name && curr.id === id) || result), false) const newArray = arr1.reduce((result, curr) => (isInArray(arr2, curr.id, curr.name) ? result : result.concat(curr)), [])

您可以使用filter()方法更新代碼,而不是使用.map()方法,例如:

 const arr1 = [ {id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "c"}, {id: 4, name: "d"}, ], arr2 = [ {id: 1, name: "a"}, {id: 4, name: "d"}, ]; let newArray = []; // new array with with no same values it should be unique. newArray = arr1.filter(function(a) { for(var i=0; i < arr2.length; i++){ if(a.id == arr2[i].id) return false; } return true; }); console.log(newArray);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

您可以使用Array.prototype.some檢查第一個數組中的每個元素的id是否在第二個數組中。 如果元素不存在,則只產生它。

 const arr1 = [ {id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "c"}, {id: 4, name: "d"}, ]; const arr2 = [ {id: 1, name: "a"}, {id: 4, name: "d"}, ]; const result = arr1.filter(x => !arr2.some(y => y.id === x.id)); console.log(result);

我認為一個簡單的比較器可以用於獲取差異然后連接它們。 使用此方法,您無需檢查哪個數組更大。

 arr1 = [ {id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "c"}, {id: 4, name: "d"}]; arr2 = [ {id: 1, name: "a"}, {id: 4, name: "d"},]; function localComparer(b){ return function(a){ return b.filter( function(item){ return item.id == a.id && item.name == a.name }).length == 0; } } var onlyInArr1 = arr1.filter(localComparer(arr2)); var onlyInArr2 = arr2.filter(localComparer(arr1)); console.log(onlyInArr1.concat(onlyInArr2));

我們可以通過檢查當前數組中是否不包含some元素來過濾值:

const result = arr1.reduce((a, c) => {
  if (!arr2.some(a2 => a2.id === c.id))
      a.push(c);
  return a;
}, [])

一個例子:

 let arr1 = [ {id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "c"}, {id: 4, name: "d"}, ]; let arr2 = [ {id: 1, name: "a"}, {id: 4, name: "d"}, ]; const result = arr1.reduce((a, c) => { if (!arr2.some(a2 => a2.id === c.id)) a.push(c); return a; }, []) console.log(result);

試試這個——

 const arr1 = [ {id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "c"}, {id: 4, name: "d"}, ]; const arr2 = [ {id: 1, name: "a"}, {id: 4, name: "d"}, ]; const arr3 = [...arr1, ...arr2]; const mySubArray = _.uniq(arr3, 'id'); console.log(mySubArray);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>

每個答案都有很多循環。

代碼的復雜性我的答案是 2N,

想法是:

  1. 合並數組。

  2. 第一個循環 - 以某種方式標記重復項

  3. 第二個循環 - 過濾重復項

 arr1 = [ {id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "c"}, {id: 4, name: "d"}, ]; arr2 = [ {id: 1, name: "a"}, {id: 4, name: "d"}, ]; let newArray = [...arr1, ...arr2].reduce((acc, item, index) => { acc.items.push(item); if (typeof acc.map[item.id] !== 'undefined') { acc.items[acc.map[item.id]] = null; acc.items[index] = null; } acc.map[item.id] = index; return acc }, {map: {}, items: []}).items.filter(item => !!item) console.log(newArray);

暫無
暫無

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

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