Lodash ลบรายการที่ซ้ำกันออกจากอาร์เรย์


232

นี่คือข้อมูลของฉัน:

[
    {
        url: 'www.example.com/hello',
        id: "22"    
    },
    {
        url: 'www.example.com/hello',
        id: "22"    
    },
    {
        url: 'www.example.com/hello-how-are-you',
        id: "23"    
    },
    {
        url: 'www.example.com/i-like-cats',
        id: "24"    
    },
    {
        url: 'www.example.com/i-like-pie',
        id: "25"    
    }
]

ด้วย Lodash ฉันจะลบวัตถุด้วยรหัสคีย์ซ้ำได้อย่างไร บางสิ่งบางอย่างที่มีตัวกรองแผนที่และไม่เหมือนใคร แต่ไม่ค่อยแน่ใจนัก

ชุดข้อมูลจริงของฉันมีขนาดใหญ่กว่าและมีปุ่มมากกว่า แต่แนวคิดควรเหมือนกัน

คำตอบ:


439

_.uniqueใช้งานไม่ได้กับเวอร์ชั่นปัจจุบันอีกต่อไปเนื่องจาก lodash 4.0.0 มีการเปลี่ยนแปลงครั้งนี้ ฟังก์ชันถูกแบ่งเป็น _.uniq, _.sortedUniq, _.sortedUniqBy, & _.uniqBy

คุณสามารถใช้_.uniqByอย่างใดอย่างหนึ่งโดย

_.uniqBy(data, function (e) {
  return e.id;
});

หรือ

_.uniqBy(data, 'id');

เอกสารประกอบ: https://lodash.com/docs#uniqBy


สำหรับ Lodash รุ่นเก่ากว่า (<4.0.0)

สมมติว่าข้อมูลควรไม่ซ้ำกันidและข้อมูลของคุณถูกเก็บไว้ในdataตัวแปรคุณสามารถใช้ฟังก์ชันพิเศษ ()ดังนี้:

_.unique(data, function (e) {
  return e.id;
});

หรือเพียงแค่

_.uniq(data, 'id');

1
Lodash 4.0.1 เอกสารได้เปลี่ยนสิ่งนี้เป็น uniqBy ไม่สามารถรับตัวอย่างด้านบนเพื่อทำงานกับชีวิตของฉันโดยใช้ uniq เท่านั้น
Will Lovett

2
ด้วย lodash 4.x, uniq () ยอมรับเพียงหนึ่งพารามิเตอร์ซึ่งเป็นอาร์เรย์ ดังนั้นตามที่ @WillLovett กล่าวว่าเราสามารถใช้ uniqBy () เพื่อแก้ปัญหานี้ได้
ersefuril

1
โอ้เด็ก. ทำไมนะทำไมมันเป็นเรื่องuniqซึ่งเป็นที่เด่นชัดคุณเข่าคิวแทนสิ่งที่มันควรจะเป็นunique...
จอชเอ็ม

56

คุณสามารถใช้ lodash method _.uniqWith ได้ในรุ่นปัจจุบันของ lodash 4.17.2

ตัวอย่าง:

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];

_.uniqWith(objects, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]

ข้อมูลเพิ่มเติม: https://lodash.com/docs/#uniqWith


6
`ให้ uniqObjects = _.uniqBy (เอกสาร, ฟังก์ชั่น (e) {return อดีต + ey;}); `วิธีนี้จะเร็วขึ้นสำหรับอาร์เรย์ขนาดใหญ่ที่มีวัตถุง่าย ๆ
tagplus5

2
ใช่ แต่คุณต้องส่งแอททริบิวเป็นอาร์กิวเมนต์แรกด้วย uniqBy ซึ่งไม่สะดวกถ้าคุณต้องการให้เป็นเอกลักษณ์โดยอิงตามคุณลักษณะหลายอย่างที่คุณยังไม่รู้
dbrrt

10

หรือเพียงใช้การรวมกันเพื่อหาอาร์เรย์ง่ายๆ

_.union([1,2,3,3], [3,5])

// [1,2,3,5]

1
ฉันชอบคำตอบนี้ มันไม่ใช่อันที่อ่านได้มากที่สุด แต่ใช้งานได้จริงถ้าคุณคิดจากมุมมองทางคณิตศาสตร์ _.union([1, 2, 2, 1, 3]) => [1, 2, 3]
Sepehr

5

เพียงแค่ใช้_.uniqBy () มันสร้างอาเรย์รุ่นที่ไม่ซ้ำกัน

นี่เป็นวิธีการใหม่และพร้อมใช้งานจากรุ่น 4.0.0

_.uniqBy(data, 'id');

หรือ

_.uniqBy(data, obj => obj.id);

4

ด้วย lodash เวอร์ชัน 4+ คุณจะลบวัตถุที่ซ้ำกันโดยคุณสมบัติเฉพาะหรือโดยวัตถุทั้งหมดเช่น:

var users = [
  {id:1,name:'ted'},
  {id:1,name:'ted'},
  {id:1,name:'bob'},
  {id:3,name:'sara'}
];
var uniqueUsersByID = _.uniqBy(users,'id'); //removed if had duplicate id
var uniqueUsers = _.uniqWith(users, _.isEqual);//removed complete duplicates

ที่มา: https://www.codegrepper.com/?search_term=Lodash+remove+duplicates+from+array



1

สำหรับอาร์เรย์อย่างง่ายคุณมีวิธีเข้าร่วม แต่คุณยังสามารถใช้:

_.uniq([2, 1, 2]);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.