# 数组去重
如传入的数组元素为[123, "meili", "123", "mogu", 123] 则输出:[123, "meili", "123", "mogu"]
如传入的数组元素为[123, [1, 2, 3], [1, "2", 3], [1, 2, 3], "meili"] 则输出:[123, [1, 2, 3], [1, "2", 3], "meili"]
如传入的数组元素为[123, {a: 1}, {a: {b: 1}}, {a: "1"}, {a: {b: 1}}, "meili"] 则输出:[123, {a: 1}, {a: {b: 1}}, {a: "1"}, "meili"]
var $ = {
filters1: function(data) {
if (!data || !data.length) return [];
var temp = {0: [], 1: []};
for (var i = 0; i < data.length; i++) {
if (!~temp[0].indexOf(JSON.stringify(data[i]))) {
temp[0].push(JSON.stringify(data[i]));
temp[1].push(data[i]);
}
}
return temp[1];
},
filters2: function(data) {
if (!data || !data.length) return [];
var temp = {};
for (var i = 0; i < data.length; i++) {
temp[JSON.stringify(data[i])] = data[i];
}
return Object.values(temp);
},
filters3: function(data) {
if (!data || !data.length) return [];
var d = new Map();
for (var i = 0; i < data.length; i++) {
d.set(JSON.stringify(data[i]), data[i]);
}
var temp = [];
d.forEach(val => {
temp.push(val);
});
return temp;
},
filters4: function(data) {
if (!data || !data.length) return [];
return data.map(JSON.stringify).filter((v, k, data) => data.indexOf(v) === k).map(JSON.parse);
},
filters5: function(data) {
if (!data || !data.length) return [];
return [...new Set(data.map(JSON.stringify))].map(JSON.parse);
}
};
总结:
- 2 输出的顺序会不一致
- 4,5 数组里有 undefined 会报错
- 使用 JSON.stringify 只是为了保证唯一值来去重
- 其实不用 JSON.stringify 也可以实现,比如取 MD5
- 如果错误欢迎指正