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

遍历对象数组并拼接键值为逗号分隔字符串的优化方案

如何高效将对象数组的同键值拼接为逗号分隔字符串

我有一个包含地址信息的对象数组:

let addressArray = [
  {
    street: '123 Charm St',
    city: 'Tuscaloosa',
    state: 'AL'
  },
  {
    street: '456 Hampton Ave',
    city: 'Tuscaloosa',
    state: 'AL'
  },
  {
    street: '789 Greenview Dr',
    city: 'Austin',
    state: 'TX'
  }
]

需要把每个键对应的所有值拼接成单个逗号分隔的字符串,示例结果如下:

streets = '123 Charm St,456 Hampton Ave,789 Greenview Dr'
cities = 'Tuscaloosa,Tuscaloosa,Austin'
states = 'AL,AL,TX'

目前我通过三次map调用再加join实现:

const streets = addressArray.map((elem) => elem.street).join(",");
const cities = addressArray.map((elem) => elem.city).join(",");
const states = addressArray.map((elem) => elem.state).join(",");

想知道有没有更简洁的方式,避免重复遍历数组?另外如果有空值,也要保留逗号分隔,比如下面的数组:

let addressArray = [
  {
    street: '',
    city: 'Tuscaloosa',
    state: 'AL'
  },
  {
    street: '456 Hampton Ave',
    city: 'Tuscaloosa',
    state: 'AL'
  },
  {
    street: '789 Greenview Dr',
    city: 'Austin',
    state: 'TX'
  }
]

对应的streets应该是,456 Hampton Ave,789 Greenview Dr。


解决方案

方案1:用reduce单次遍历收集值

只遍历数组一次,将每个键的值存入对应数组,最后统一拼接:

const { streets, cities, states } = addressArray.reduce((acc, curr) => {
  acc.streets.push(curr.street);
  acc.cities.push(curr.city);
  acc.states.push(curr.state);
  return acc;
}, { streets: [], cities: [], states: [] });

const streetsStr = streets.join(',');
const citiesStr = cities.join(',');
const statesStr = states.join(',');

这种方式比三次map效率更高,空值会被正常保留,拼接后自动生成符合要求的字符串。

方案2:用forEach遍历收集(更直观)

如果觉得reduce不够直白,用forEach实现同样逻辑:

const streets = [];
const cities = [];
const states = [];

addressArray.forEach(addr => {
  streets.push(addr.street);
  cities.push(addr.city);
  states.push(addr.state);
});

const streetsStr = streets.join(',');
const citiesStr = cities.join(',');
const statesStr = states.join(',');

代码逻辑简单清晰,同样只遍历一次数组,兼容空值场景。

方案3:通用函数处理任意键(灵活复用)

如果需要处理不同的键集合,可以写一个通用函数,适配更多场景:

function extractAndJoin(arr, keys) {
  const result = {};
  // 初始化每个键对应的数组
  keys.forEach(key => result[key] = []);
  
  arr.forEach(item => {
    keys.forEach(key => {
      result[key].push(item[key] ?? ''); // 兼容undefined或null的情况
    });
  });
  
  // 转换为逗号分隔字符串
  keys.forEach(key => {
    result[key] = result[key].join(',');
  });
  
  return result;
}

// 使用示例
const { streets, cities, states } = extractAndJoin(addressArray, ['street', 'city', 'state']);

这个函数可以灵活处理任意键,同时保证空值、undefined都能被正确处理,生成符合要求的拼接字符串。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:35:01