# 数组去重

如传入的数组元素为[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
  • 如果错误欢迎指正