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

如何通用实现对象数组的转置/透视(基于指定键值)及还原

通用对象数组的转置(透视)与还原实现

转置函数(按指定键透视原始数组)

该函数接收统一结构的对象数组和指定分组键,将数组转置为以原始属性名为维度的新数组——每个对象包含属性名,以及对应各分组键值的属性(格式为${指定键}_${键值})。

实现代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:49:51