JavaScript中如何按指定规则比较不同长度的两个数组?
如何按指定规则比较并合并两个长度不同的数组?
这是个很清晰的数组匹配+补全需求,核心就是以Array1的顺序为绝对基准,根据Array2的元素情况生成对应结果。我直接写一个可复用的函数,再逐个验证你给出的规则:
核心实现代码
function mergeArrays(array1, array2) { // 用Map存Array2的lang与对应对象,实现快速查找 const langToItem = new Map(array2.map(item => [item.lang, item])); const result = []; for (let i = 0; i < array1.length; i++) { const currentLang = array1[i]; const matchedItem = langToItem.get(currentLang); if (matchedItem) { // 找到匹配项,加入结果并从Map移除(避免重复匹配) result.push(matchedItem); langToItem.delete(currentLang); } else { // 检查当前元素之后的Array1项里,是否还有未匹配的Array2元素 const hasUnmatchedLater = array1.slice(i + 1) .some(nextLang => langToItem.has(nextLang)); if (hasUnmatchedLater) { // 后面还有匹配项,补带Maybe属性的对象 result.push({ lang: currentLang, Maybe: 'i_can_add_other_Attribute' }); } else { // 后面没有任何匹配项了,直接停止遍历(对应规则2) break; } } } return result; }
验证你的三个规则
规则1测试
const arr1 = ['en', 'fr', 'eg']; const arr2 = [{ lang: 'en' }, { lang: 'eg' }]; console.log(mergeArrays(arr1, arr2)); // 输出结果: // [{ lang: 'en' }, { lang: 'fr', Maybe: 'i_can_add_other_Attribute' }, { lang: 'eg' }]
完全符合要求,中间缺失的fr因为后面还有eg匹配项,所以自动补全了带指定属性的对象。
规则2测试
const arr1 = ['en', 'fr', 'eg']; const arr2 = [{ lang: 'en' }, { lang: 'fr' }]; console.log(mergeArrays(arr1, arr2)); // 输出结果:[{ lang: 'en' }, { lang: 'fr' }]
遍历到eg时,发现后续已经没有未匹配的Array2元素,直接停止循环,结果只保留已匹配的项。
规则3测试(顺序验证)
哪怕Array2是乱序的,结果也严格遵循Array1的顺序:
const arr1 = ['en', 'fr', 'eg']; const arr2 = [{ lang: 'eg' }, { lang: 'en' }]; console.log(mergeArrays(arr1, arr2)); // 输出结果: // [{ lang: 'en' }, { lang: 'fr', Maybe: 'i_can_add_other_Attribute' }, { lang: 'eg' }]
完美符合“结果必须遵循Array1元素顺序”的要求。
代码关键点说明
- 用
Map做快速查找,比反复遍历Array2效率更高,尤其是数组规模较大时; - 每次匹配后删除Map中的项,避免同一个Array2元素被重复匹配;
- 通过检查后续元素的匹配状态,精准区分规则1和规则2的场景;
- 一旦发现后续无匹配项就停止遍历,减少不必要的循环开销。
内容的提问来源于stack exchange,提问作者Mian person
相关产品推荐
相关产品推荐

