如何通过唯一 ID 和唯一名称过滤对象数组?

How to filter an array of objects by unique ID and unique name?

我有一个对象数组,如下所示:

    [
      {
        id: 1234
        name: Name1
      },
      {
        id: 5678
        name: Name1
      },
      {
        id: 1234
        name: Name1
      },
      {
        id: 5678
        name: Name2
      },
    ]

我想过滤并删除具有相同 ID 和相同名称的对象,因此预期结果如下所示:

    [
      {
        id: 1234
        name: Name1
      },
      {
        id: 5678
        name: Name1
      },
      {
        id: 5678
        name: Name2
      },
    ]

但是我只能通过唯一 ID 过滤对象数组,我不确定如何满足同名的额外条件:

data.filter((value, index, self) => {
  return (
    self.findIndex((v) => v.id=== value.id) === index
  );
});

您可以简单地使用 && 来包含需要满足的其他条件:在您的示例中,您需要 id name 匹配:

const filteredData = data.filter((value, index, self) => 
  self.findIndex(v => v.id === value.id && v.name === value.name) === index
);

如果你有多个key要考虑,又不想写多个&&语句,可以简单的把key存放在一个数组中,然后用Array.prototype.every()强制执行比赛:

const keys = ['id', 'name'];
const filteredData = data.filter((value, index, self) => 
  self.findIndex(v => keys.every(k => v[k] === value[k])) === index
);

见下文proof-of-concept:

const data = [{
    id: 1234,
    name: 'Name1'
  },
  {
    id: 5678,
    name: 'Name1'
  },
  {
    id: 1234,
    name: 'Name1'
  },
  {
    id: 5678,
    name: 'Name2'
  },
];

const keys = ['id', 'name'];
const filteredData = data.filter((value, index, self) =>
  self.findIndex(v => keys.every(k => v[k] === value[k])) === index
);

console.log(filteredData);

您可以在 findIndex 中扩展和添加另一个条件。像这样

data.filter((value, index, self) => {
  return (
    self.findIndex((v) => v.id === value.id && v.name === value.name) === index
  );
});

但这很耗时。如果你创建一个散列并使用它来过滤掉,你会更好。

data.reduce( (acc, current) => {
 acc[`${current.name}#${current.id}`] = current;
 return acc
}, {}).values()

我在这里所做的是为 name/id 的每个唯一组合创建一个条目,然后只获取该对象的值。

您可以使用 array.filter() method along with array.indexOf() and array.lastIndexOf()

来尝试这个直接的解决方案

工作演示:

const obj = [
  {
    id: 1234,
    name: 'Name1'
  },
  {
    id: 5678,
    name: 'Name1'
  },
  {
    id: 1234,
    name: 'Name1'
  },
  {
    id: 5678,
    name: 'Name2'
  }
];

const res = obj.filter((item, index, obj) => 
    obj.indexOf(item) && obj.lastIndexOf(item)
);

console.log(res);

使用Array.reduce迭代并return通过删除基于相同idname属性的重复项得到最终数组;要检查重复的对象值,您可以使用 Set 来跟踪唯一值。

const objList = [
    {
        id: 1234,
        name: "Name1"
    },
    {
        id: 5678,
        name: "Name1"
    },
    {
        id: 1234,
        name: "Name1"
    },
    {
        id: 5678,
        name: "Name2"
    },
];

const removeDuplicate = (arr) => {
    const set = new Set();
    return arr.reduce((finalList, {id, name}) => {
        const key = `${id}${name}`;
        if (!set.has(key)) {
            finalList.push({
                id,
                name
            })
        }
        set.add(key);
        return finalList;
    }, []);
}

console.log(removeDuplicate(objList));