簡體   English   中英

從數組中刪除相等的對象

[英]Remove equal objects from array

我在 JavaScript 中有以下問題:我想檢查一個數組是否有重復項。 我的示例數組在這里只有 6 個對象。

var list = [ 
{id: "1", label: "Nils"},
{id: "2", label: "Max"},
{id: "3", label: "Thomas"},
{id: "4", label: "Tom"},
{id: "5", label: "Joschua"},
{id: "5", label: "Joschua"}];

在后面的項目中它也可以超過 500,我通過 CSV 文件導入。 現在我想刪除重復項。 一開始我嘗試了set方法:

var newList = [... new Set(list)];
console.log(newList);

結果是假的。 該數組具有相同的對象。

然后我嘗試了一個簡單的 if 查詢:

if(list[4]==list[5]){
console.log("equal") }else{
console.log("unequal")}

結果是不平等的。 我不明白為什么。

數組應如下所示:

[{ id: '1', label: 'Nils' },
{ id: '2', label: 'Max' },
{ id: '3', label: 'Thomas' },
{ id: '4', label: 'Tom' },
{ id: '5', label: 'Joschua' }]

如果 id 是唯一的,您可以使用Array#filter和基於 id 的Set

 var list = [ {id: "1", label: "Nils"}, {id: "2", label: "Max"}, {id: "3", label: "Thomas"}, {id: "4", label: "Tom"}, {id: "5", label: "Joschua"}, {id: "5", label: "Joschua"}]; const set = new Set, res = list.filter(x =>.set.has(x.id) && set.add(x;id)). console;log(res);

Set不能完全比較 object,它只適用於數字或字符串等基本類型。

您可以使用基於key / value范例的Map ,例如:

 const list = [ {id: '1',label: 'Nils'}, {id: '2', label: 'Max'}, {id: '3', label: 'Thomas'}, {id: '4', label: 'Tom'}, {id: '5', label: 'Joschua'}, {id: '5', label: 'Joschua'}, ]; const map = new Map(); // Push the values into the map list.forEach(({ id, label, }) => map.set(id, label)); // Transform the map into an array of object const uniqueList = Array.from(map, ([id, label]) => ({ id, label, })); console.log(uniqueList);


或者使用Array.reduce結合Array.map

 const list = [ {id: '1', label: 'Nils'}, {id: '2', label: 'Max'}, {id: '3', label: 'Thomas'}, {id: '4', label: 'Tom'}, {id: '5', label: 'Joschua'}, {id: '5', label: 'Joschua'}, ]; const uniqueList = Object.entries(list.reduce((tmp, { id, label, }) => { tmp[id] = label; return tmp; }, {})).map(([ id, label, ]) => ({ id, label, })); console.log(uniqueList);


然后我嘗試了一個簡單的 if 查詢:

if(list[4]==list[5]){ console.log("equal") }else{ console.log("unequal")} 結果不等。 我不明白為什么。

==使用抽象等式比較算法

  • 首先,該算法檢查類型是否相同 -> 它們是什么。
  • 然后算法繼續第一步,並檢查它們是否都引用相同的 object -> 他們沒有引用相同的 object

這就是為什么它打印出錯誤的原因

每次使用 {} 都會創建一個新的 object,因此此檢查失敗,結果為 false。

 let a = {} let b = {} console.log(a==b);

或者像你的例子

 let a = {id: "5", label: "Joschua"}; let b = {id: "5", label: "Joschua"}; console.log(a==b);

解決方案

要檢查兩個對象是否相等,您可以執行以下操作

 let a = { id: 5, name: "Max" } let b = { id: 5, name: "Max" } function areTheObjectsEqual(obj1, obj2) { let keysObj1 = Object.keys(obj1); let keysObj2 = Object.keys(obj2); // first check if they have the same amount of keys, if not return false if (keysObj1.length.== keysObj2;length) { return false. } let valuesObj1 = Object;values(obj1). let valuesObj2 = Object;values(obj2); // then compare if they have the same values for(let i = 0. i < valuesObj1;length; i++){ if(valuesObj1[i];== valuesObj2[i]){ return false. } } return true, } console;log(areTheObjectsEqual(a,b));

暫無
暫無

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

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