js怎么给对象数组去重?

基本类型的数组去重很容易,但是对象类型的数组该怎么去重呢?
试过转Set类型的方式不起作用,循环比对的话也不准,因为有可能后一个对象只比前一个对象少了一个属性,其它属性都相同。

有没有大佬对对象数组去重有好的方法呢?再延伸一下二维数组去重该怎么弄呢?(不知道会不会遇到这种场景)

阅读 3.2k
3 个回答

说到底还是写hash函数,能根据对象的特征值生成不同的hashCode,直接用现成的就行
codesandbox
object-hash

import hash from "object-hash";

var peter = {
  name: "Peter",
  stapler: false,
  friends: ["Joanna", "Michael", "Samir"]
};
var michael = { name: "Michael", stapler: false, friends: ["Peter", "Samir"] };
var bob = { name: "Bob", stapler: true, friends: [] };
var bob1 = { name: "Bob", stapler: true, friends: [1] };
var bob2 = { stapler: true, name: "Bob", friends: [1, {}] };
var bob3 = { stapler: false, name: "Bob", friends: [1, {}] };
var bob4 = { stapler: false, name: "Bob", friends: [1, {}] };

const deduplicate = (arr) => {
  const set = new Set();
  const ans = [];

  for (let i = 0; i < arr.length; ++i) {
    const hashCode = hash(arr[i]);
    if (!set.has(hashCode)) {
      ans.push(arr[i]);
      set.add(hashCode);
    }
  }

  return ans;
};

console.log(deduplicate([peter, michael, bob, bob1, bob2, bob3, bob4]));

lodash _.isEqual 不用考虑对象还是数组还是个啥

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题