TypeScript实现:仅将不存在的元素添加至目标数组
TypeScript实现:将新数组中不存在的元素合并到原数组
看起来你需要把Users2Add里不在Users中的用户添加进去,我来给你写对应的TypeScript实现,顺便优化一下逻辑~
首先先明确你给出的两个数组:
const Users = [ { "id": 0, "name": "Scott" }, { "id": 0, "name": "Jan" }, { "id": 0, "name": "Jack" }, ]; const Users2Add = [ { "id": 0, "name": "Scott" }, { "id": 0, "name": "Andy" }, { "id": 0, "name": "John" }, ];
基础实现(和你的预期逻辑一致)
你提到的contains其实不是JavaScript/TypeScript数组的原生方法,我们可以用some来判断元素是否存在,这是最贴合你思路的写法:
// 遍历要添加的每个用户 Users2Add.forEach(userToAdd => { // 检查原数组中是否有相同id的用户 const userExists = Users.some(existingUser => existingUser.id === userToAdd.id); // 不存在就推送到原数组 if (!userExists) { Users.push(userToAdd); } }); // 验证结果 console.log(Users);
高效优化方案(适合大数据量)
如果你的数组元素比较多,每次用some遍历原数组会有点慢,我们可以先把原数组的id存到Set里,这样判断存在性的效率会更高:
// 先把已存在的用户id存入Set,O(n)时间 const existingIds = new Set(Users.map(user => user.id)); // 过滤出需要添加的用户,再批量推入原数组 const newUsers = Users2Add.filter(user => !existingIds.has(user.id)); Users.push(...newUsers); console.log(Users);
补充说明
- 注意你示例里所有用户的
id都是0,这会导致Andy和John也不会被添加(因为原数组已经有id=0的用户了)。如果你的实际需求是用用户名判断唯一性,只需要把判断条件改成existingUser.name === userToAdd.name就行。 - 如果需要同时用
id和name判断(比如相同id但不同名算重复,或者不同id同名算不同),可以调整判断逻辑:const userExists = Users.some(existingUser => existingUser.id === userToAdd.id && existingUser.name === userToAdd.name );
内容的提问来源于stack exchange,提问作者Zabih Khaliqi
相关产品推荐
相关产品推荐

