如何计算字符串中数字的出现?

时间:2019-09-14 04:51:24

标签: javascript ecmascript-6

假设我有一个看起来像这样的字符串:

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解决方案?

2 个答案:

答案 0 :(得分:2)

您可以使用reduce和Map

  • ,上分割字符串
  • 遍历数组并计数每个数字的出现
  • 浏览mapper的条目,如果需要,请按升序对它们进行排序,如果您需要的输入与输入中的顺序相同,请不要对它进行排序
  • 将条目映射为“数字(重复)形式”
  • 通过,加入他们

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