假设我有一个函数可以合并字符串中的重复项并用逗号附加值
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']
。
这是有道理的,您还没有剥离任何值。
请注意,在第二个示例中,即使没有重复值,您仍然不希望其中出现逗号。
跳过空字符串
您可以做的一件事是从列表中过滤掉所有空字符串,而不是进行重复数据删除,方法是:
- 在
reduce
方法中,如果v === ''
则跳过r.set
- 在字符串格式化程序中使用
v[1].filter(val => val !== '')
重复数据删除?
正如我所提到的,从您描述规范的方式来看,您总是希望丢弃空字符串。
如果您仍想在此基础上进行重复数据删除,请考虑:
- 将
Set
作为映射而不是列表的值。它会为您删除重复数据。 - 编写您自己的
独特
函数:
/** 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/