[英]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
會在尋找匹配時短路,但如果數據集變大,事情可能會變慢。 這是Set
和Map
進來的。
所以要使用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,
想法是:
合並數組。
第一個循環 - 以某種方式標記重復項
第二個循環 - 過濾重復項
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.