如何通用实现对象数组的转置/透视(基于指定键值)及还原
通用对象数组的转置(透视)与还原实现
转置函数(按指定键透视原始数组)
该函数接收统一结构的对象数组和指定分组键,将数组转置为以原始属性名为维度的新数组——每个对象包含属性名,以及对应各分组键值的属性(格式为${指定键}_${键值})。
实现代码
function transposeArrayByKey(arr, key) { // 提取指定键的所有唯一值 const keyValues = [...new Set(arr.map(item => item[key]))]; // 提取所有非指定键的属性名 const propertyNames = Object.keys(arr[0]).filter(prop => prop !== key); // 生成转置后的数组 return propertyNames.map(prop => { const result = { propertyName: prop }; keyValues.forEach(val => { const targetItem = arr.find(item => item[key] === val); result[`${key}_${val}`] = targetItem ? targetItem[prop] : undefined; }); return result; }); }
还原函数(将转置数组恢复为原始结构)
该函数接收转置后的数组和原指定分组键,将其还原为最初的对象数组结构。
实现代码
function restoreTransposedArray(transposedArr, key) { // 从转置对象的属性名中解析出所有分组键的取值 const keyValues = transposedArr[0] ? Object.keys(transposedArr[0]) .filter(prop => prop.startsWith(`${key}_`)) .map(prop => prop.replace(`${key}_`, '')) : []; // 生成原始结构的数组 return keyValues.map(val => { const result = { [key]: val }; transposedArr.forEach(item => { result[item.propertyName] = item[`${key}_${val}`]; }); return result; }); }
示例验证
原始输入数组
const originalData = [ { "property0": "property0_2024", "property1": "property1_2024", "property2": "property2_2024", "property3": "property3_2024", "property4": "property4_2024", "year": "2024" }, { "property0": "property0_2025", "property1": "property1_2025", "property2": "property2_2025", "property3": "property3_2025", "property4": "property4_2025", "year": "2025" }, { "property0": "property0_2026", "property1": "property1_2026", "property2": "property2_2026", "property3": "property3_2026", "property4": "property4_2026", "year": "2026" }, { "property0": "property0_2027", "property1": "property1_2027", "property2": "property2_2027", "property3": "property3_2027", "property4": "property4_2027", "year": "2027" } ];
转置操作
const transposedData = transposeArrayByKey(originalData, 'year'); console.log(transposedData);
输出结果与需求中的示例输出完全一致。
还原操作
const restoredData = restoreTransposedArray(transposedData, 'year'); console.log(restoredData);
输出结果与原始输入数组完全一致。
注意事项
- 要求原始数组中所有对象结构统一,拥有相同的属性键
- 若原始数组存在缺失指定键的对象,转置时对应属性会设为
undefined - 分组键的值支持任意类型(字符串、数字等),函数会自动处理属性名拼接
内容的提问来源于stack exchange,提问作者anu l
相关产品推荐
相关产品推荐

