假设我有一个看起来像这样的字符串:
let str ="1,2,3,3,3,4,5,1,4,3,5,2";
我要将以下内容输出到控制台:
"1(2),2(2),3(4),4(2),5(2)"
尝试过地图/过滤器,但无法正常工作:
function dingetje(){
let str = "1,2,3,4,1,4";
let ar =str.split();
let count = 0;
let result;
ar.map(item =>
if (item === ar[count]){
result =result + item;
}
} )
}
如何为此编写优雅的es6解决方案?
答案 0 :(得分:2)
您可以使用reduce和Map
,
上分割字符串,
加入他们
let str ="1,2,3,3,3,4,5,1,4,3,5,2"
function counter(str){
let mapper = str.split(',').reduce((op,inp)=>{
op.set(inp, (op.get(inp) || 0 ) + 1)
return op
},new Map())
return [...mapper]
.sort((a,b)=>a[0]-b[0]) // if you need in always in ascending order
.map(([key,value])=>`${key}(${value})`)
.join(',')
}
console.log(counter(str))
console.log(counter("1,2,3,2,3,43,4,53,5,3"))
答案 1 :(得分:0)
在这里,我为您创建了一个单行,没有排序;)
const counter = s => s
.split(',')
.reduce((r, n) => (++(r.find(({x}) => x === n) || r[(r.push({x: n, c:0})) -1]).c && r), [])
.map(({x,c}) => `${x}(${c})`)
.join(',');
如果要对其进行排序,可以在地图之前添加排序
const counter2 = s => s
.split(',')
.reduce((r, n) => (++(r.find(({x}) => x === n) || r[(r.push({x: n, c:0})) -1]).c && r), [])
.sort(({x},{x:y}) => x-y)
.map(({x,c}) => `${x}(${c})`)
.join(',');
是的,我知道它很丑陋,但是如果您只需要一个简短的解决方案,请采取:P