如何在JavaScript中按另一数组的属性顺序调整对象数组元素索引?
按指定数组的属性顺序调整另一个数组的子数组排序
你需要根据arrA中对应元素的b数组的c属性顺序,重新排列arrB里每个元素的b数组。以下是可行的实现方案:
实现思路
- 为
arrA中的每个元素建立**c属性的优先级映射**:以元素的a值为键,存储其b数组中每个c值对应的排序索引(索引越小,排序越靠前)。 - 遍历
arrB,匹配对应a值的优先级映射,用这个映射对b数组排序,让arrB的b数组顺序和arrA保持一致。
代码实现
const arrA= [{ a: 1, b: [{ c: 2, d: 3 }, { c: 5, f: 6 }] }, { a: 2, b: [{ c: 2, d: 3 }, { c: 5, f: 6 }] } ]; const arrB = [{ a: 1, b: [{ c: 5, f: 6 }, { c: 2, d: 3 }] }, { a: 2, b: [{ c: 5, f: 6 }, { c: 2, d: 3 }] } ]; // 构建arrA的c属性优先级映射 const orderMap = arrA.reduce((acc, current) => { acc[current.a] = current.b.reduce((cIndexMap, item, idx) => { cIndexMap[item.c] = idx; return cIndexMap; }, {}); return acc; }, {}); // 调整arrB的b数组顺序 const adjustedArrB = arrB.map(item => { const cPriority = orderMap[item.a]; if (!cPriority) return item; // 无对应a值时保持原顺序 return { ...item, b: [...item.b].sort((x, y) => cPriority[x.c] - cPriority[y.c]) }; }); console.log(adjustedArrB);
代码说明
- 优先级映射构建:通过两次
reduce生成orderMap,结构为{ a值: { c值: 排序索引 } },能快速查询每个c值在目标顺序中的位置。 - 排序逻辑:使用数组的
sort方法,比较b数组中每个对象的c值在优先级映射中的索引,索引小的排在前面,完美对齐arrA的顺序。 - 数据不可变性:用扩展运算符
...复制原对象和数组,避免修改原始数据,符合现代JS开发的最佳实践。
边界情况处理
- 如果
arrB中存在arrA没有的a值,该元素的b数组会保持原顺序。 - 如果
arrB的b数组中有arrA对应b数组没有的c值,这些元素会被排在最后(若需要调整可自定义逻辑)。
内容的提问来源于stack exchange,提问作者Лунатик
相关产品推荐
相关产品推荐

