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

时间:2017-05-10 12:54:41

标签: javascript arrays

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

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

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

2 个答案:

答案 0 :(得分:3)

您可以将元素转换为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);

.as-console-wrapper { max-height: 100% !important; top: 0; }




地图会维护项目的添加顺序,因此此流程不会更改原始订单。

您也可以使用中间Set而不是Map来执行此操作,但是您需要从JSON重建对象,当您在对象中具有非JSON兼容的某些非键属性时(如函数):

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

答案 1 :(得分:1)

Array#map的双重使用,但允许您避免只有Chrome和Firefox支持的Object.values()



var arr = [  
    { person: { amount: [1,1] } },
    { person: { amount: [1,1] } }, 
    { person: { amount: [2,1] } },
    { person: { amount: [1,2] } },
    { person: { amount: [1,2] } }
], res = [...new Set(arr.map(v => JSON.stringify(v)))].map(v => JSON.parse(v));
   
   console.log(JSON.stringify(res));