javascript - 合并字符串中的重复项并用逗号附加它会给出错误的输出

标签 javascript

假设我有一个函数可以合并字符串中的重复项并用逗号附加值

let check = 'test_name=sdf&test_name=dfgdfg&test_last_name=dfg';

let final = check.split('&').map(v=>v.split('=')).reduce((r,[k,v])=>{
  r.set(k, (r.get(k)||[]).concat(v))
  return r
},new Map())


let output = [...final].map(v=>`${v[0]}=${v[1].join(',')}`).join('&')

console.log(output)

该值将是(这是正确的)

test_name=sdf,dfgdfg&test_last_name=dfg

我的问题是当我测试时

let check = 'test_name=&test_name=&test_last_name=dfg';

输出将是

test_name=,&test_last_name=dfg // now there is a comma

如果没有值,正确的输出应该是

test_name=&test_last_name=dfg // no comma

当我也测试时

let check = 'test_name=&test_name=eqwe&test_last_name=dfg';

它给了我错误的输出

test_name=,eqwe&test_last_name=dfg 

正确的应该是

test_name=eqwe&test_last_name=dfg 

知道我该怎么做吗?谢谢

最佳答案

您的问题发生的原因是:

test_name=,&test_last_name=dfg // now there is a comma

test_name 映射到 ['', '']

并在

test_name=,eqwe&test_last_name=dfg

test_name 映射到 ['', 'eqwe']

这是有道理的,您还没有剥离任何值。

请注意,在第二个示例中,即使没有重复值,您仍然不希望其中出现逗号。

跳过空字符串

您可以做的一件事是从列表中过滤掉所有空字符串,而不是进行重复数据删除,方法是:

  1. reduce 方法中,如果 v === '' 则跳过 r.set
  2. 在字符串格式化程序中使用 v[1].filter(val => val !== '')

重复数据删除?

正如我所提到的,从您描述规范的方式来看,您总是希望丢弃空字符串。

如果您仍想在此基础上进行重复数据删除,请考虑:

  1. Set 作为映射而不是列表的值。它会为您删除重复数据。
  2. 编写您自己的独特函数:
/** Returns unique copy of arr in the same order as the elements in arr */
function unique(arr) {
  const set = new Set();

  for (const item of arr) {
    set.add(item);
  }

  return Array.from(set.values());
}

关于javascript - 合并字符串中的重复项并用逗号附加它会给出错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58211667/

相关文章:

第二次提交时忽略 Javascript PreventDefault()

javascript - 修改 ng-messages 指令以仅在字段为 $dirty 时显示

javascript - JS 按钮,递增/递减无法在输入字段上正确工作

javascript - 动画图像 slider 在 Chrome 中闪烁

javascript - 从 Bootstrap 导航栏滚动到元素

javascript - CSS 过渡动画未应用于内联 svg <text> 但在 <rect> 上它工作正常吗?

javascript - 使用 jquery 自动完成和工具提示

javascript - pikachoose 轮播的不同 img src

javascript - Firestore云函数查询数据库查询后返回值?

javascript - 隐藏和显示 HTML 表格中的内容