如何依据字符串数组将对象数组拆分为指定的两个子数组?
问题分析与解决方案
嘿,我一眼就瞅到你代码里的两个小问题,这就是为啥没得到预期结果的原因:
- 条件判断写错了:你把要匹配的目标写成了
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
相关产品推荐
相关产品推荐

