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

如何依据字符串数组将对象数组拆分为指定的两个子数组?

问题分析与解决方案

嘿,我一眼就瞅到你代码里的两个小问题,这就是为啥没得到预期结果的原因:

  • 条件判断写错了:你把要匹配的目标写成了arr1[i],但实际上应该和arr2[i]做比较,这完全是个笔误;
  • 嵌套循环的逻辑缺陷:每次遍历arr2的元素时,只要arr1的当前元素不匹配就往optional里塞,这会导致同一个元素被重复添加多次(比如Arabic会在arr2的三次循环里都被push进去),最后optional里会有大量重复项。

修复后的代码方案

推荐用更简洁清晰的方式来实现,直接遍历arr1,判断每个元素的key是否存在于arr2中,这样逻辑更直观,也不会出错:

let arr1= [{"key": "English","code": "en"}, {"key": "Arabic","code": "ar"}, {"key": "Chinese (traditional)","code": "zh"}, {"key": "Czech", "code": "cs"}, {"key": "Dutch","code": "nl"},{"key": "Finnish","code": "fi"}];
let arr2 = ["English", "Dutch", "Finnish"];
let completed =[];
let optional =[];

// 遍历arr1的每个元素
arr1.forEach(item => {
  if (arr2.includes(item.key)) {
    completed.push(item);
  } else {
    optional.push(item);
  }
});

console.log('completed:', completed);
console.log('optional:', optional);

更优雅的写法(使用filter)

如果你喜欢更函数式的写法,可以用filter方法直接生成两个数组,代码更简洁:

let arr1= [{"key": "English","code": "en"}, {"key": "Arabic","code": "ar"}, {"key": "Chinese (traditional)","code": "zh"}, {"key": "Czech", "code": "cs"}, {"key": "Dutch","code": "nl"},{"key": "Finnish","code": "fi"}];
let arr2 = ["English", "Dutch", "Finnish"];

// 把arr2转成Set,判断存在性的性能会更好(尤其是数组很大的时候)
const targetKeys = new Set(arr2);

const completed = arr1.filter(item => targetKeys.has(item.key));
const optional = arr1.filter(item => !targetKeys.has(item.key));

console.log('completed:', completed);
console.log('optional:', optional);

这里把arr2转成Set的原因是,Set.has()的时间复杂度是O(1),而Array.includes()是O(n),如果你的数组元素很多的话,用Set会更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:07:47