从嵌套对象数组中删除重复项并保留其顺序:javascript

Suh*_*wan 2 javascript arrays

我需要从数组中删除重复项而不损害它们的顺序。请考虑这个数据数组

var array = [  { person: { amount: [1,1] } },
{ person: { amount: [1,1] } }, 
{ person: { amount: [2,1] } },
{ person: { amount: [1,2] } },
{ person: { amount: [1,2] } }];
Run Code Online (Sandbox Code Playgroud)

我知道它可以通过使用 new Set([iterable]) 来完成,但不能使用这个数组。如果有人有想法,请帮忙。提前致谢。

tri*_*cot 5

您可以将元素转换为 JSON 并将它们用作 Map 的键,然后将其转换回数组(现在使用 Nina Scholz 建议的更新):

var array = [  
    { person: { amount: [1,1] } },
    { person: { amount: [1,1] } }, 
    { person: { amount: [2,1] } },
    { person: { amount: [1,2] } },
    { person: { amount: [1,2] } }
];

var result = [...new Map(array.map( o => [JSON.stringify(o), o])).values()];

console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)

Map 维护向其中添加项目的顺序,因此此过程不会更改原始顺序。

您也可以使用中间 Set 而不是 Map 来执行此操作,但是您需要从 JSON 重建对象,当您的对象中有一些与 JSON 不兼容的非关键属性(如函数)时,这会限制功能:

var result = Array.from(new Set(array.map( o => JSON.stringify(o))), s => JSON.parse(s));
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,@NinaScholz,您的见解一如既往地有价值!我无耻地把它带进了我的回答中——省略了一对括号。 (2认同)