นับจำนวนอักขระที่เกิดขึ้นในสตริงใน Javascript


525

ฉันต้องนับจำนวนครั้งของอักขระในสตริง

ตัวอย่างเช่นสมมติว่าสตริงของฉันมี:

var mainStr = "str1,str2,str3,str4";

ฉันต้องการหาจำนวน,ตัวอักษรคอมม่าซึ่งก็คือ 3 และจำนวนของสตริงแต่ละตัวหลังจากแยกตามคอมม่าซึ่งก็คือ 4

ฉันต้องตรวจสอบว่าแต่ละสตริงเช่น str1 หรือ str2 หรือ str3 หรือ str4 ไม่ควรเกิน 15 ตัวอักษร

คำตอบ:


765

ฉันได้อัปเดตคำตอบนี้แล้ว ฉันชอบความคิดในการใช้การจับคู่ที่ดีกว่า แต่ก็ช้ากว่า:

console.log(("str1,str2,str3,str4".match(/,/g) || []).length); //logs 3

console.log(("str1,str2,str3,str4".match(new RegExp("str", "g")) || []).length); //logs 4

jsfiddle

ใช้นิพจน์ทั่วไปตามตัวอักษรหากคุณรู้ว่าคุณกำลังค้นหาอะไรอยู่ก่อนหน้าหากไม่สามารถใช้ตัวRegExpสร้างและส่งผ่านgค่าสถานะเป็นอาร์กิวเมนต์

matchส่งคืนnullโดยไม่มีผลลัพธ์ดังนั้น|| []

คำตอบเดิมที่ฉันทำในปี 2009 อยู่ด้านล่าง มันสร้างอาร์เรย์ที่ไม่จำเป็น แต่การใช้ตัวแยกนั้นเร็วกว่า (ณ เดือนกันยายน 2014) ฉันสงสัยว่าถ้าฉันต้องการความเร็วจริงๆคงไม่มีคำถามที่ฉันจะใช้การแบ่ง แต่ฉันต้องการใช้การจับคู่

คำตอบเก่า (จาก 2009):

หากคุณกำลังมองหาจุลภาค:

(mainStr.split(",").length - 1) //3

หากคุณกำลังมองหาสาย

(mainStr.split("str").length - 1) //4

ทั้งคำตอบใน @ Lo และในการแยกการทดสอบ jsperf ที่โง่เง่าของฉันมาพร้อมความเร็วอย่างน้อยใน Chrome แต่การสร้างอาร์เรย์เพิ่มเติมอีกครั้งดูเหมือนจะไม่ได้มีเหตุผล


8
การทดสอบแสดงว่า Firefox นั้นเร็วกว่าเบราว์เซอร์อื่น ๆ เมื่อแยกออกจากกัน jsperf.com/count-the-number-of-occurances-in-string
vsync

4
เอ่อฉันเพิ่งทดสอบ jsperf ของ vsync และ regex นั้นช้าลงใน Chrome, Firefox และ IE 68%, 100% และ 14% ตามลำดับ ฉันมี i7 2600
มอส

56
ฉันไม่ชอบความคิดในการใช้ regex เพราะ "คุณชอบดีกว่า" Regexes มีจุดประสงค์ แต่โดยทั่วไปเมื่อมีวิธีแก้ปัญหาที่ไม่ใช่ regex ง่าย ๆ มันเป็นตัวเลือกที่ดี โปรดทราบว่าทั้งสองวิธีสร้างอาร์เรย์ดังนั้นจึงไม่มีเหตุผลที่จะใช้ regex เช่นกัน
แจสเปอร์

4
ฉันชอบที่ดีกว่าในกรณีนี้ด้วยเหตุผล การแบ่งสตริงออกเป็นอาร์เรย์เพื่อรับจำนวนเหตุการณ์ที่เกิดขึ้นเป็นรอบเกี่ยวกับวิธีการรับข้อมูลนั้น การแยกอาเรย์นั้นทำได้เร็วขึ้นเพียงเพราะรายละเอียดการใช้งานบางอย่างที่สามารถเปลี่ยนแปลงได้ในขณะที่การจับคู่จำนวนมากเป็นการปรับปรุงความสามารถในการอ่านความตั้งใจชัดเจนและไม่สร้างและเติมโครงสร้างข้อมูลที่ไม่ได้ใช้
Bjorn

30
split () เป็นเครื่องมือพื้นฐานใน javascript, conceptually ง่ายและนับแยกให้ความตั้งใจที่ชัดเจนและสามารถอ่านได้ทั้งหมด
bradw2k

217

มีอย่างน้อยสี่วิธี ตัวเลือกที่ดีที่สุดซึ่งควรจะเป็นเครื่องมือที่พัฒนาเร็วที่สุดสำหรับ RegEx ดั้งเดิม - วางไว้ที่ด้านบน jsperf.com ไม่สามารถใช้งานได้มิฉะนั้นฉันจะให้สถิติประสิทธิภาพแก่คุณ

อัปเดต : โปรดค้นหาการทดสอบประสิทธิภาพที่นี่และดำเนินการด้วยตนเองเพื่อสนับสนุนผลการปฏิบัติงานของคุณ ข้อมูลเฉพาะของผลลัพธ์จะได้รับในภายหลัง

1

 ("this is foo bar".match(/o/g)||[]).length
 //>2

2

"this is foo bar".split("o").length-1
 //>2

ไม่แนะนำให้แยก ทรัพยากรหิว จัดสรรอินสแตนซ์ใหม่ของ 'Array' สำหรับการแข่งขันแต่ละครั้ง อย่าลองใช้ไฟล์> 100MB ผ่าน FileReader คุณสามารถสังเกตการใช้งาน EXACT ได้อย่างง่ายดายโดยใช้ตัวเลือกProfiler ของ Chrome

3

var stringsearch = "o"
   ,str = "this is foo bar";
for(var count=-1,index=-2; index != -1; count++,index=str.indexOf(stringsearch,index+1) );
 //>count:2

4

ค้นหาอักขระเดี่ยว

var stringsearch = "o"
   ,str = "this is foo bar";
for(var i=count=0; i<str.length; count+=+(stringsearch===str[i++]));
 //>count:2

ปรับปรุง:

5

การแมปองค์ประกอบและการกรองไม่แนะนำเนื่องจากการจัดสรรทรัพยากรโดยรวมแทนที่จะใช้ Pythonian 'generators'

var str = "this is foo bar"
str.split('').map( function(e,i){ if(e === 'o') return i;} )
             .filter(Boolean)
//>[9, 10]
[9, 10].length
//>2

แชร์: ฉันทำแก่นสารนี้ด้วย 8 วิธีการนับตัวละครในปัจจุบันดังนั้นเราจึงสามารถรวมกลุ่มและแบ่งปันความคิดของเราได้โดยตรงเพื่อความสนุกและอาจเป็นมาตรฐานที่น่าสนใจ :)

https://gist.github.com/2757250


27
ฉันใช้เวลาสักครู่เพื่อตระหนักว่า||[]กำลังทำอะไรอยู่ แต่คำตอบนี้ยอดเยี่ยม! สำหรับคนอื่น ๆ ที่เกาหัวพวกเขาmatch()จะส่งคืนnullหากไม่พบการแข่งขันและ||[]จะส่งกลับอาร์เรย์ 0 ความยาวหากmatch()ผลตอบแทนnullหมายถึงlength()ผลตอบแทน 0 แทนการผลิตข้อผิดพลาดประเภท
นาธาน

1
นาธานเพื่อการป้องกันของฉันฉันไม่ทำอย่างละเอียดในว่าก่อนที่จะเขียนโค้ดข้างต้น: gist.github.com/2757164 ฉันต้องการหลีกเลี่ยงการโพสต์บล็อกของรหัสชิ้นเล็ก ๆ ซึ่งจะช่วยให้คุณเข้าถึงได้ทันทีผ่านการค้นหาของ Google สรุปเป็นส่วนหนึ่งของพื้นที่เก็บข้อมูลตัวอย่างมีการจัดทำดัชนีน้อยมากและน้อยกว่าในอุดมคติ PS: ฉันก็เกลียดความคิดเชิงวากยสัมพันธ์ที่ไม่ชัดเจนเหมือนกัน
Lorenz Lo Sauer

2
แท้จริงซาวเออร์ไม่จำเป็นต้องปกป้องตัวเองรหัสเป็นของแข็งและฉันได้เรียนรู้บางอย่างด้วยตัวเองโดยการหาวิธีการทำงาน :) ฉันชอบวิธีนี้มากกว่าสิ่งที่ถูกทำเครื่องหมายเป็นคำตอบจริง ไม่จำเป็นต้องแยกสตริงหากเราไม่ต้องการใช้ผลลัพธ์
นาธาน

3
วิธีที่สามของคุณ (และเร็วที่สุด) จะพลาดการแข่งขันใด ๆ ที่ดัชนี 0 ในกองหญ้า คุณสามารถแก้ไขได้โดยใช้ do ... while loop แทน: var strsearch = "o", str = "othis คือ foo bar", index = -1, count = -1; ทำ {index = str.indexOf (strsearch, index + 1); นับ ++; } ในขณะที่ (ดัชนี! = -1); นับ
ออกัสตัส

1
มันเพียงพอแล้วที่จะเริ่มต้นindex = -2แต่ต้องขอบคุณ @Augustus
Lorenz Lo Sauer

18

เพิ่มฟังก์ชั่นนี้ใน sting prototype:

String.prototype.count=function(c) { 
  var result = 0, i = 0;
  for(i;i<this.length;i++)if(this[i]==c)result++;
  return result;
};

การใช้งาน:

console.log("strings".count("s")); //2

แล้ว"stringsstringstrings".count("str")ไงล่ะ
Toskan

12

การค้นหาโดยGoogleอย่างรวดเร็วได้สิ่งนี้ (จากhttp://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurrences_of_a_specific_character_in_a_string#JavaScript )

String.prototype.count=function(s1) { 
    return (this.length - this.replace(new RegExp(s1,"g"), '').length) / s1.length;
}

ใช้มันแบบนี้:

test = 'one,two,three,four'
commas = test.count(',') // returns 3

4
ข้อผิดพลาดใน*char ( SyntaxError: nothing to repeat)

1
อาร์กิวเมนต์ต้องเป็นนิพจน์ทั่วไป ดังนั้นหากคุณต้องการนับคุณต้องส่งใน '[* ]'
เจอราร์ดโอนีล

8

เพียงใช้การแบ่งเพื่อค้นหาจำนวนที่เกิดขึ้นของตัวละครในสตริง

mainStr.split(',').length // ให้ 4 ซึ่งเป็นจำนวนสตริงหลังจากแยกโดยใช้ตัวคั่นจุลภาค

mainStr.split(',').length - 1 // ให้ 3 ซึ่งเป็นจำนวนเครื่องหมายจุลภาค


นี่เป็นคำตอบที่จำเป็นโดยทั่วไปที่นี่ ฉันช็อคไม่มีใครชี้ให้เห็นเลย
Rohit Gupta

7

นี่คือโซลูชันที่คล้ายกัน แต่ใช้ Array.prototype.reduce

function countCharacters(char, string) {
  return string.split('').reduce((acc, ch) => ch === char ? acc + 1: acc, 0)
}

ดังที่ได้กล่าวไปแล้วString.prototype.splitทำงานได้เร็วกว่าString.prototype.replaceมาก


6

ฉันพบว่าวิธีที่ดีที่สุดในการค้นหาอักขระในสตริงที่มีขนาดใหญ่มาก (นั่นคือ 1,000,000 ตัวอักษรเป็นต้น) คือการใช้replace()วิธีนี้

window.count_replace = function (str, schar) {
    return str.length - str.replace(RegExp(schar), '').length;
};

คุณสามารถเห็นชุดJSPerf อีกชุดเพื่อทดสอบวิธีนี้พร้อมกับวิธีอื่นในการค้นหาอักขระในสตริง


เห็นได้ชัดว่าถ้ารหัสของคุณวนซ้ำมากกว่าล้านตัวอักษร 500,000 ครั้งต่อวินาทีซีพียูของฉันทำงานอย่างน้อย 100GHz (สมมติว่าไม่มี SIMD แม้จะเป็นอย่างน้อย 40GHz) ดังนั้นฉันไม่เชื่อว่ามาตรฐานนี้ถูกต้อง
สรรพนามของฉันคือ monicareinstate

5

นอกจากนี้คุณยังสามารถพักสายของคุณและทำงานกับมันเหมือนอาร์เรย์ขององค์ประกอบที่ใช้

const mainStr = 'str1,str2,str3,str4';
const commas = [...mainStr].filter(l => l === ',').length;

console.log(commas);

หรือ

const mainStr = 'str1,str2,str3,str4';
const commas = [...mainStr].reduce((a, c) => c === ',' ? ++a : a, 0);

console.log(commas);


1
อันที่สองมีประโยชน์ขอบคุณ!
AlexGera

4

ฉันทำการปรับปรุงเล็กน้อยในคำตอบที่ยอมรับจะช่วยให้ตรวจสอบกับการจับคู่ case-sensitive / case-insensitive และเป็นวิธีการที่แนบมากับวัตถุสตริง:

String.prototype.count = function(lit, cis) {
    var m = this.toString().match(new RegExp(lit, ((cis) ? "gi" : "g")));
    return (m != null) ? m.length : 0;
}

lit เป็นสตริงที่จะค้นหา (เช่น 'ex') และ cis คือ case-insensitivity, default เป็น false จะอนุญาตให้มีตัวเลือกสำหรับการจับคู่แบบ insensitive


หากต้องการค้นหาสตริง'I love StackOverflow.com'สำหรับอักษรตัวพิมพ์เล็ก'o'คุณจะต้องใช้:

var amount_of_os = 'I love StackOverflow.com'.count('o');

amount_of_os2จะเท่ากับ


หากเราต้องค้นหาสตริงเดิมอีกครั้งโดยใช้การจับคู่แบบตัวพิมพ์เล็กและใหญ่คุณจะใช้:

var amount_of_os = 'I love StackOverflow.com'.count('o', true);

เวลานี้amount_of_osจะเท่ากับ3เนื่องจากได้รับทุนOจากสตริงที่รวมอยู่ในการค้นหา


4

ตกลงคนอื่น ๆ ที่มี regexp - อาจจะไม่เร็ว แต่สั้นและดีกว่าที่อ่านได้แล้วคนอื่น ๆ ในกรณีของฉันเพียง'_'เพื่อนับ

key.replace(/[^_]/g,'').length

เพียงแค่ลบทุกอย่างที่ไม่เหมือนกับตัวละครของคุณ แต่มันดูไม่ดีกับสตริงที่เป็นอินพุต


4

ประสิทธิภาพการทำงานของ Split vs RegExp

var i = 0;

var split_start = new Date().getTime();
while (i < 30000) {
  "1234,453,123,324".split(",").length -1;
  i++;
}
var split_end = new Date().getTime();
var split_time = split_end - split_start;


i= 0;
var reg_start = new Date().getTime();
while (i < 30000) {
  ("1234,453,123,324".match(/,/g) || []).length;
  i++;
}
var reg_end = new Date().getTime();
var reg_time = reg_end - reg_start;

alert ('Split Execution time: ' + split_time + "\n" + 'RegExp Execution time: ' + reg_time + "\n");


4

วิธีที่ง่ายที่สุดที่ฉันค้นพบ ...

ตัวอย่าง-

str = 'mississippi';

function find_occurences(str, char_to_count){
    return str.split(char_to_count).length - 1;
}

find_occurences(str, 'i') //outputs 4

กระชับ! ขอบคุณ!
LeOn - Han Li

3

ฉันกำลังทำงานในโครงการขนาดเล็กที่ต้องการตัวนับสตริงย่อย การค้นหาวลีที่ไม่ถูกต้องทำให้ฉันไม่มีผลลัพธ์ แต่หลังจากเขียนการใช้งานของฉันเองฉันก็สะดุดกับคำถามนี้ อย่างไรก็ตามนี่คือวิธีของฉันมันอาจช้ากว่าที่นี่มาก แต่อาจเป็นประโยชน์กับใครบางคน:

function count_letters() {
var counter = 0;

for (var i = 0; i < input.length; i++) {
    var index_of_sub = input.indexOf(input_letter, i);

    if (index_of_sub > -1) {
        counter++;
        i = index_of_sub;
    }
}

http://jsfiddle.net/5ZzHt/1/

โปรดแจ้งให้เราทราบหากคุณพบว่าการดำเนินการนี้ล้มเหลวหรือไม่เป็นไปตามมาตรฐานบางประการ! :)

อัปเดต คุณอาจต้องการทดแทน:

    for (var i = 0; i < input.length; i++) {

ด้วย:

for (var i = 0, input_length = input.length; i < input_length; i++) {

อ่านเรื่องที่น่าสนใจเกี่ยวกับข้างต้น: http://www.erichynds.com/blog/javascript-length-property-is-a-stored-value


1
ใช่และมันจะทำงานกับซับสตริงไม่เพียง แต่ซับสตริง อย่างไรก็ตามคุณต้องเพิ่มพารามิเตอร์เข้ากับฟังก์ชั่น :)
Nico


2

นี่คือทางออกของฉัน มีวิธีแก้ไขปัญหามากมายที่โพสต์ก่อนหน้าฉัน แต่ฉันชอบที่จะแบ่งปันมุมมองของฉันที่นี่

const mainStr = 'str1,str2,str3,str4';

const commaAndStringCounter = (str) => {
  const commas = [...str].filter(letter => letter === ',').length;
  const numOfStr = str.split(',').length;

  return `Commas: ${commas}, String: ${numOfStr}`;
}

// Run the code
console.log(commaAndStringCounter(mainStr)); // Output: Commas: 3, String: 4

ที่นี่คุณพบ REPL ของฉัน


2

วิธีที่เร็วที่สุดดูเหมือนว่าจะผ่านตัวดำเนินการดัชนี:

function charOccurances (str, char)
{
  for (var c = 0, i = 0, len = str.length; i < len; ++i)
  {
    if (str[i] == char)
    {
      ++c;
    }
  }
  return c;
}

console.log( charOccurances('example/path/script.js', '/') ); // 2

หรือเป็นฟังก์ชั่นต้นแบบ:

String.prototype.charOccurances = function (char)
{
  for (var c = 0, i = 0, len = this.length; i < len; ++i)
  {
    if (this[i] == char)
    {
      ++c;
    }
  }
  return c;
}

console.log( 'example/path/script.js'.charOccurances('/') ); // 2


1

ต่อไปนี้ใช้นิพจน์ทั่วไปเพื่อทดสอบความยาว testex ทำให้คุณมั่นใจได้ว่าคุณไม่มีตัวอักษรที่ไม่ใช่เครื่องหมายจุลภาคติดต่อกัน 16 ตัวขึ้นไป หากผ่านการทดสอบก็จะดำเนินการแยกสตริง การนับจุลภาคนั้นง่ายพอ ๆ กับการนับโทเค็นลบหนึ่ง

var mainStr = "str1,str2,str3,str4";
var testregex = /([^,]{16,})/g;
if (testregex.test(mainStr)) {
  alert("values must be separated by commas and each may not exceed 15 characters");
} else {
  var strs = mainStr.split(',');
  alert("mainStr contains " + strs.length + " substrings separated by commas.");
  alert("mainStr contains " + (strs.length-1) + " commas.");
}


1

สิ่งที่เกี่ยวกับ string.split (ต้องการCharecter) .length-1

ตัวอย่าง:

var str = "hellow ชีวิตเป็นอย่างไร"; var len = str.split ("h"). length-1; จะให้จำนวน 2 สำหรับอักขระ "h" ในสตริงด้านบน


1

ฉันใช้ Node.js v.6.0.0 และเร็วที่สุดคืออันที่มีดัชนี (วิธีที่ 3 ในคำตอบของ Lo Sauer)

ประการที่สองคือ:

function count(s, c) {
  var n = 0;
  for (let x of s) {
    if (x == c)
      n++;
  }
  return n;
}


1

นี่เป็นวิธีหนึ่งที่เกือบเร็วพอ ๆ กับการแยกและวิธีการแทนที่ซึ่งเร็วกว่าวิธี regex เล็กน้อย (เป็นโครเมียม)

var num = 0;
for (ch of "str1,str2,str3,str4")
{
    if (ch === ',') num++;
}

1

ฉันเพิ่งทำการทดสอบที่รวดเร็วและสกปรกบนrepl.itโดยใช้ Node v7.4 สำหรับอักขระตัวเดียวมาตรฐานสำหรับการวนซ้ำนั้นเร็วที่สุด:

บางรหัส :

// winner!
function charCount1(s, c) {
    let count = 0;
    c = c.charAt(0); // we save some time here
    for(let i = 0; i < s.length; ++i) {
        if(c === s.charAt(i)) {
            ++count;
        }
    }
    return count;
}

function charCount2(s, c) {
    return (s.match(new RegExp(c[0], 'g')) || []).length;
}

function charCount3(s, c) {
    let count = 0;
    for(ch of s) {
        if(c === ch) {
            ++count;
        }
    }
    return count;
}

function perfIt() {
    const s = 'Hello, World!';
    const c = 'o';

    console.time('charCount1');
    for(let i = 0; i < 10000; i++) {
        charCount1(s, c);
    }
    console.timeEnd('charCount1');

    console.time('charCount2');
    for(let i = 0; i < 10000; i++) {
        charCount2(s, c);
    }
    console.timeEnd('charCount2');

    console.time('charCount3');
    for(let i = 0; i < 10000; i++) {
        charCount2(s, c);
    }
    console.timeEnd('charCount3');
}

ผลลัพธ์จากการรันไม่กี่ :

 perfIt()
charCount1: 3.843ms
charCount2: 11.614ms
charCount3: 11.470ms
=> undefined
   perfIt()
charCount1: 3.006ms
charCount2: 8.193ms
charCount3: 7.941ms
=> undefined
   perfIt()
charCount1: 2.539ms
charCount2: 7.496ms
charCount3: 7.601ms
=> undefined
   perfIt()
charCount1: 2.654ms
charCount2: 7.540ms
charCount3: 7.424ms
=> undefined
   perfIt()
charCount1: 2.950ms
charCount2: 9.445ms
charCount3: 8.589ms

1

และมี:

function character_count(string, char, ptr = 0, count = 0) {
    while (ptr = string.indexOf(char, ptr) + 1) {count ++}
    return count
}

ทำงานร่วมกับจำนวนเต็มเกินไป!


0

ทางออกของฉัน:

function countOcurrences(str, value){
   var regExp = new RegExp(value, "gi");
   return str.match(regExp) ? str.match(regExp).length : 0;  
}

สิ่งนี้จะไม่ทำงานเป็นString.prototype.matchผลตอบแทนnullโดยไม่มีการจับคู่ นั่นหมายความว่าไม่มีการอ้างอิงไปยังวัตถุที่มีlengthแอตทริบิวต์ ในคำอื่น ๆ :String.prototype.match.call('willnotwork', /yesitwill/) === null
Lorenz Lo Sauer

0

วิธีที่ห้าใน Leo Sauers ตอบล้มเหลวถ้าตัวละครอยู่ที่จุดเริ่มต้นของสตริง เช่น

var needle ='A',
  haystack = 'AbcAbcAbc';

haystack.split('').map( function(e,i){ if(e === needle) return i;} )
  .filter(Boolean).length;

จะให้ 2 แทน 3 เพราะ funtion ตัวกรอง Boolean ให้ค่าเท็จเป็น 0

ฟังก์ชั่นตัวกรองอื่น ๆ ที่เป็นไปได้:

haystack.split('').map(function (e, i) {
  if (e === needle) return i;
}).filter(function (item) {
  return !isNaN(item);
}).length;

0

ฉันรู้ว่านี่อาจเป็นคำถามเก่า แต่ฉันมีทางออกที่ง่ายสำหรับผู้เริ่มต้นระดับต่ำใน JavaScript

เป็นผู้เริ่มต้นผมเท่านั้นที่จะเข้าใจบางส่วนของการแก้ปัญหากับคำถามนี้ดังนั้นผมจึงใช้สองซ้อนกันสำหรับลูปเพื่อตรวจสอบตัวละครแต่ละตัวกับทุกตัวละครอื่น ๆ ในสตริง, incrementing นับตัวแปรสำหรับตัวละครแต่ละตัวพบว่ามีค่าเท่ากับตัวละครที่

ฉันสร้างวัตถุว่างใหม่โดยที่คีย์คุณสมบัติแต่ละตัวเป็นอักขระและค่าเป็นจำนวนครั้งที่อักขระแต่ละตัวปรากฏในสตริง (นับ)

ฟังก์ชั่นตัวอย่าง: -

function countAllCharacters(str) {
  var obj = {};
  if(str.length!==0){
    for(i=0;i<str.length;i++){
      var count = 0;
      for(j=0;j<str.length;j++){
        if(str[i] === str[j]){
          count++;
        }
      }
      if(!obj.hasOwnProperty(str[i])){
        obj[str[i]] = count;
      }
    }
  }
  return obj;
}

0

ฉันเชื่อว่าคุณจะพบโซลูชันด้านล่างนี้สั้นมากเร็วมากสามารถทำงานกับสตริงที่ยาวมากสามารถรองรับการค้นหาตัวละครหลายตัวพิสูจน์ข้อผิดพลาดและสามารถจัดการการค้นหาสตริงว่างได้

function substring_count(source_str, search_str, index) {
    source_str += "", search_str += "";
    var count = -1, index_inc = Math.max(search_str.length, 1);
    index = (+index || 0) - index_inc;
    do {
        ++count;
        index = source_str.indexOf(search_str, index + index_inc);
    } while (~index);
    return count;
}

ตัวอย่างการใช้งาน:

console.log(substring_count("Lorem ipsum dolar un sit amet.", "m "))

function substring_count(source_str, search_str, index) {
    source_str += "", search_str += "";
    var count = -1, index_inc = Math.max(search_str.length, 1);
    index = (+index || 0) - index_inc;
    do {
        ++count;
        index = source_str.indexOf(search_str, index + index_inc);
    } while (~index);
    return count;
}

โค้ดด้านบนแก้ไขข้อผิดพลาดด้านประสิทธิภาพที่สำคัญของ Jakub Wawszczyk ซึ่งโค้ดดังกล่าวยังคงมองหาการจับคู่แม้ว่า indexOf จะบอกว่าไม่มีและรุ่นของตัวเองไม่ทำงานเพราะเขาลืมที่จะให้พารามิเตอร์อินพุตฟังก์ชั่น


0
var a = "acvbasbb";
var b= {};
for (let i=0;i<a.length;i++){
    if((a.match(new RegExp(a[i], "g"))).length > 1){
        b[a[i]]=(a.match(new RegExp(a[i], "g"))).length;
    }
}
console.log(b);

ในจาวาสคริปต์คุณสามารถใช้โค้ดด้านบนเพื่อรับตัวอักษรในสตริง



0

ฟังก์ชั่นใช้สตริง str เป็นพารามิเตอร์และนับจำนวนอักขระที่ไม่ซ้ำกันในสตริง ผลลัพธ์มาในคู่ของคีย์ - ค่าสำหรับแต่ละอักขระ

var charFoundMap = {};//object defined
    for (var i = 0; i < str.length; i++) {

       if(!charFoundMap[ str[i] ])  {
        charFoundMap[ str[i] ]=1;
       } 
       else
       charFoundMap[ str[i] ] +=1;
       //if object does not contain this 
    }
    return charFoundMap;

} 

คุณลืมส่วนที่สองของคำถาม: "ฉันต้องตรวจสอบว่าแต่ละสตริงเช่น str1 หรือ str2 หรือ str3 หรือ str4 หรือ str4 ไม่ควรเกินพูด 15 ตัวอักษร"
Maxime Launois
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.