You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于name字段合并数组并去重,且保持selected元素前置

合并两个对象数组并去重(selected元素前置)

我有两个对象数组:

const selected = [];
const current = [
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];
const result = []

需要生成无重复元素的result数组,规则为:

  • selected中的元素必须置于result开头
  • 基于name字段判断元素是否重复

示例说明

示例1:selected为空

输入:

const selected = [];
const current = [
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];

预期结果:

result = [
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];

示例2:selected含current没有的元素

输入:

const selected = [ {id:5, name: "xyz" }];
const current = [
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];

预期结果:

result = [
  { id: 5, name: "xyz" },
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];

示例3:selected与current存在重复元素

输入:

const selected = [ {id:1, name: "abc" }, {id:4, name: "lmn" }];
const current = [
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];

预期结果:

result = [
  { id: 1, name: "abc" },
  { id: 4, name: "lmn" },
  { id: 2, name: "def" }
];

我尝试的代码(未达预期)

const res = [...(selected || [])].filter((s) =>
  current.find((c) => s.name === c.name)
);

解决方案

要实现需求,我们需要保留selected全部元素,再从current中过滤掉与selected重复的元素(按name判断),最后将两部分拼接。使用Set存储已存在的name可提升判断重复的效率:

// 收集selected中所有name,快速判断重复
const selectedNames = new Set(selected.map(item => item.name));

// 先把selected的所有元素放入结果
const result = [...selected];

// 过滤current中未在selected出现过的元素,追加到结果
result.push(...current.filter(item => !selectedNames.has(item.name)));

验证结果

  • 示例1:selected为空,current所有元素都被追加,结果符合预期
  • 示例2:selected中的xyz保留,current的abc、def因未重复被追加,结果正确
  • 示例3:selected中的abc、lmn保留,current中仅def未重复被追加,结果正确

内容的提问来源于stack exchange,提问作者user16860065

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:36:23