数组缩减未返回预期结果

时间:2018-12-02 14:26:45

标签: javascript

我正在研究通过数组过滤器传递的搜索功能,然后进行归约操作以使正确的字符串彼此匹配,但是在获得预期结果时遇到了一些困难。

我有一个要映射到其值的常用短语的枚举,例如,如果搜索Amer,它也应该与American相匹配。为此,我为对象设置了一些带有减少值的值,该值应将该值添加到搜索字符串中,例如,如果API数据或搜索数据包含U Street African Amer,则应将其转换为{{1 }}。如果找不到任何映射的数据,则应传回原始函数参数。

u street african amer american

我遇到的问题是,它返回的是未定义的,或者仅根据返回到函数的内容在返回的语句中添加一个映射的短语。任何帮助,将不胜感激!

2 个答案:

答案 0 :(得分:2)

您将需要以reduce作为初始值来开始stationName,然后始终将其串联为previous而不是原始的stationName值:

const acronymEnum = {
  MT: 'Mountain',
  AMER: 'American',
  PL: 'Place',
  UDC: 'Univeristy of the District of Columbia',
  AU: 'American University',
  AVE: 'Avenue',
  CUA: 'Catholic University of America',
  NOMA: 'North of Massechusets Avenue',
  GMU: 'George Mason University',
  VT: 'Virginia Tech',
  UVA: 'University of Virginia',
  RAEGAN: 'DCA',
  ST: 'Street',
  SW: 'South West',
  SQ: 'Square',
  PENN: 'Pennsylvania',
};

function convertStationAcronym(stationName) {
  return Object.keys(acronymEnum).reduce((previous, currentKey) => {
    const re = new RegExp("\\b" + currentKey + "\\b", "i"); // TODO: escape special characters
    if (re.test(stationName)) {
      console.log('trigger the match', currentKey)
      return previous.concat(' ', acronymEnum[currentKey]);
//           ^^^^^^^^
    } else {
     return previous;
    }
  }, stationName).toLowerCase();
//   ^^^^^^^^^^^
}

console.log(convertStationAcronym('U Street African Amer'))

答案 1 :(得分:1)

该问题的另一种解决方案是将输入字符串分成一个数组,对于数组中的每个元素,我们将在acronymEnum Object中找到该条目。如果输入字符串的长度较小,则此方法将更有效。

const acronymEnum = {
  MT: 'Mountain',
  AMER: 'American',
  PL: 'Place',
  UDC: 'Univeristy of the District of Columbia',
  AU: 'American University',
  AVE: 'Avenue',
  CUA: 'Catholic University of America',
  NOMA: 'North of Massechusets Avenue',
  GMU: 'George Mason University',
  VT: 'Virginia Tech',
  UVA: 'University of Virginia',
  RAEGAN: 'DCA',
  ST: 'Street',
  SW: 'South West',
  SQ: 'Square',
  PENN: 'Pennsylvania',
};

function convertStationAcronym(stationName) {
  let stationNameArray = stationName.split(" ");
  let result =  stationNameArray.map((item)=> { 
    return acronymEnum[item.toUpperCase()] 
      ? acronymEnum[item.toUpperCase()]
      :item 
  })
  return result.join(" ");
}

console.log(convertStationAcronym('U Street African Amer'))