如字符串arr="abcdaabc",请用js读取出arr字符串中每个字母重复出现的次数分别是多少?
reduce不兼容低版本哦,还有比这个更简洁的吗?
var temp = {};
'abcdaabc'.replace(/(\w{1})/g,function($1){
temp[$1] ? temp[$1]+=1 : temp[$1] = 1;
})
console.log(temp) // {a: 3, b: 2, c: 2, d: 1}
var obj = {}
'abcdaabc efgh'.replace(/(\w)/g,function(word,p){
obj[p[0]] ? obj[p[0]]+=1 : obj[p[0]] =1
})
console.log(obj)
@leftstick 的方案无可挑剔,但有些花哨了,对理解基本的原理不是最佳选择
那我就把它翻译成 plain js 吧
function charStats(str) {
var visitStats = {};
for (var i = 0; i < str.length; i++) {
var char = str[i];
if (!visitStats[char]++)
visitStats[char] = 1;
}
return visitStats;
}
console.log(charStats('abcdaabc')); // {a: 3, b: 2, c: 2, d: 1}
const arr="abcdaabc";
let counter = {};
for (let i = 0, len = arr.length; i < len; i++ ) {
counter[arr[i]] ? counter[arr[i]]++ : counter[arr[i]] = 1;
}
console.log(counter);
不是最简洁的,期待更好的答案。
来一个效率更高的二叉树
var str='sadzewrwewasdfaxzvzxfasdaswe';
function count(s, e)
{
if(s>e)
{
return {};
}
else if(s==e)
{
var x=str.charAt(s);
var json={};
json[x]=1;
return json;
}
var c=Math.floor((s+e)/2);
var l=count(s, c);
var r=count(c+1, e);
var result=l;
for(var i in r)
{
if(result[i])
{
result[i]+=r[i];
}
else
{
result[i]=r[i];
}
}
return result;
}
console.log(count(0, str.length-1));
在字符串的前提条件下,对字符进行排序,使用字符串的lastIndexOf或数组的lastIndexOf方法是一个思路,可以减少查询次数。
var str = "aasdkfjwoensweljoipwefslnvxcvasfs";
str = str.split('').sort().join('');
var result = {}
for(var i = 0, j = str.length; i < j; i++){
var char = str[i];
result[char] = str.lastIndexOf(char) - i + 1;
i = str.lastIndexOf(char)
}
console.table(result);
另外:
var str = "aasdkfjwoensweljoipwefslnvxcvasfs";
str = str.split('').sort().join('');
var arr = str.match(/(\w)\1+/g);
var result = {}
for(var i = 0, j = arr.length; i < j; i++){
var item = arr[i];
result[item.charAt(0)] = item.length;
}
console.table(result);
var obj = {};
'abcdaabc'.split('').sort().join('').replace(/(.)(\1+)?/g, function(m,k){obj[k] = m.length});
console.log(obj); // {a: 3, b: 2, c: 2, d: 1}
不是最优,只是提供另一个思路,兼容所有浏览器。
var arr="abcdaabc"
var count = {};
var i,k
for(i=0;i<arr.length;i++){
var chr = arr.charAt(i);
if( typeof count[chr] === "undefined"){
count[chr] = 1;
}else{
count[chr]++;
}
}
console.log(count)
for(k in count){
if(count.hasOwnProperty(k)){
console.log("%s:%d",k,count[k]);
}
}
var str = "addbsnjfsss";
var strArray = str.split("");
var returnObj = {};
for(var i = 0; i < strArray.length; i++) {
if(returnObj[strArray[i]]) {
returnObj[strArray[i]] = parseInt(returnObj[strArray[i]]) + 1;
} else {
returnObj[strArray[i]] = 1;
}
}
for(var p in returnObj) {
console.log(p + " : " + returnObj[p]);
}
大家的方法都大同小异,期待见到更好的想法 =v=
var str = 'abcdacbacxjkl';
var Counter = new Counter();
Counter.count(str);
console.log(Counter.getResult()); //{a: 3, b: 2, c: 3, d: 1, x: 1…}
function Counter() {
var temp = {};
var push = function(item) {
temp[item] = temp[item] ? ++temp[item] : 1;
}
this.count = function(str) {
str.split('').forEach( function(item) {
push(item);
});
}
this.getResult = function() {
return temp;
}
}
var str = "aaaabbbccccddfgh";
var o={};
for(var i=0;i<str.length;i++){
var key = str.charAt(i);
if(o[key] && o[key].value==key) {
o[key].count+=1;
}
else{
o[key]={};
o[key].value=key;
o[key].count=1;
}
};
for(key in o){
console.log(o[key].value+'='+o[key].count);
};
var str = 'abcdaabc';
var result = {};
str.split('').forEach(function (char) {
var val = result[char];
result[char] = val ? ++val : 1;
});
console.log(result);
难道就没有一个用replace的?
function getSameWordCount(str) {
var count = {};
if (typeof str !== 'string') {
return count;
}
while (str) {
var originCount = str.length;
var char = str.charAt(0);
var charCount = (str = str.replace(new RegExp(char, 'g'), '')).length;
count[char] = originCount - charCount;
}
return count;
}
var arr = 'absdakbsabdabsab';
var _ss = arr.split('');
var _aa = [];
_ss.map(function(e){
var _find = findChar(e);
if(_find !== -1) _aa[_find].num++;
else _aa.push({code:e,num:1});
})
function findChar(c){
return _aa.findIndex(function(ele,index){
if(ele.code === c) return true;
})
}
findIndex
E6规范
var str="dfjkfkhsdjk hksjh",
i=0,
obj={};
for(i=0;i<str.length;i++) {
var ch=str.charAt(i);
if (!obj[ch]) {
obj[ch]=1;
} else{
obj[ch]++;
}
}
for(var r in obj)
{
console.log(r+","+obj[r]);
}
function getShowTimes(string,indexChar){
//返回一个字符在字符串中出现的次数
return (string.split(indexChar).length-1);
}
var str = "aabbccf";
var arr = str.split("");
var count = {};
arr.forEach(function(i) {
count[i] = (count[i]||0)+1;
});
console.log(count);
var temp = {};
'abcdaabc'.replace(/(w{1})/g,function($1){
temp[$1] ? temp[$1]+=1 : temp[$1] = 1;
})
console.log(temp) // {a: 3, b: 2, c: 2, d: 1}
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
坐等更好方案: