我需要从数组中删除重复的项目而不会损害他们的顺序。 请考虑这个数据数组
var array = [ { person: { amount: [1,1] } },
{ person: { amount: [1,1] } },
{ person: { amount: [2,1] } },
{ person: { amount: [1,2] } },
{ person: { amount: [1,2] } }];
我知道可以通过使用新的Set([iterable])来完成,但不能使用此数组。如果有人有想法,请帮忙。提前谢谢。
答案 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));