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

如何将键数组与对象数组转换为指定结构数组?代码返回undefined

问题描述

我有两个数组如下:

const firstarray = ['prop1', 'prop2', 'prop3']

const secondArray = [
       {
         id: 'prop1',
         values:['teste1', 'teste2', 'teste3']
       },
    {
         id: 'prop2',
         values:['value1', 'value2', 'value3']
       },
    {
         id: 'prop3',
         values:['anotherValue1', 'anotherValue2', 'anotherValue3']
       }
]

希望转换为结构如下的新数组:

const array = [
{prop1: 'teste1', prop2: 'value1', prop3: 'anotherValue1' },
{prop1: 'teste2', prop2: 'value2', prop3: 'anotherValue2' },
{prop1: 'teste3', prop2: 'value3', prop3: 'anotherValue3' }
]

我尝试了以下代码,但得到的是一个由undefined组成的数组:

const newArray = this.firstArray.map((key:string) => {
const obj = this.secondArray.find((element:any) => element.id ==key)
obj.values.map((value:any) => {key: value});
})

请问该如何解决?

错误原因

你的代码存在两个关键问题:

  • 外层firstArray.map的回调函数没有返回值,每一次迭代都会默认返回undefined,最终得到全是undefined的数组。
  • 逻辑方向错误:你是按firstArray的每个key遍历,但目标是构建对应索引位置的对象数组,应该以values的索引为基准循环,而非按key循环。
解决方案

这里提供两种可行的实现方式:

方法一:基于映射+索引循环(高效推荐)

先把secondArray转换成id到values的映射表,避免重复调用find,再按索引构建每个对象:

// 构建id与对应values数组的映射
const valueMap = new Map(secondArray.map(item => [item.id, item.values]));
// 确定结果数组的长度(取第一个key对应的values长度)
const resultLength = valueMap.get(firstarray[0])?.length || 0;

const newArray = Array.from({ length: resultLength }, (_, index) => {
  return firstarray.reduce((obj, key) => {
    obj[key] = valueMap.get(key)[index];
    return obj;
  }, {});
});

方法二:简化版(适合已知所有values长度一致的场景)

如果可以确定所有values数组的长度相同,也可以直接基于第一个元素的values长度循环:

const newArray = secondArray[0].values.map((_, idx) => {
  return firstarray.reduce((acc, key) => {
    const targetItem = secondArray.find(el => el.id === key);
    acc[key] = targetItem.values[idx];
    return acc;
  }, {});
});

内容的提问来源于stack exchange,提问作者paulotarcio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:20:42