Javascript 返回indexOf而不是模式计数的数组

Javascript 返回indexOf而不是模式计数的数组,javascript,Javascript,因此,我对代码进行了一些编辑,但我一直在尝试计算模式在指定记录中出现的次数 如果在中搜索类似于的内容,我希望数组返回为2,1,0,但目前我得到的是13,19,-1 如果有任何关于如何改进代码的提示,我将不胜感激 books = [ { title: "Inheritance: Inheritance Cycle, Book 4", author: "Christopher Paolini", }, { title: "The Sense of an End

因此,我对代码进行了一些编辑,但我一直在尝试计算模式在指定记录中出现的次数

如果在中搜索类似于的内容,我希望数组返回为2,1,0,但目前我得到的是13,19,-1

如果有任何关于如何改进代码的提示,我将不胜感激

books = [
    {
    title: "Inheritance: Inheritance Cycle, Book 4",
    author: "Christopher Paolini",
    },
{
    title: "The Sense of an Ending",
    author: "Julian Barnes"},
{
    title: "Snuff Discworld Novel 39",
    author: "Sir Terry Pratchett",
    }
]
search = prompt("Title?");

function count(books, pattern) {

        var num = 0;
        var result = [];
        for (i = 0; i < books.length; i++) {
            var index = books[i].title.toLowerCase().indexOf(pattern.toLowerCase());
            do {
                result[i] = index;
                index = books[i].title.toLowerCase().indexOf(pattern.toLowerCase(), index + 1);
            }
            while (index >= 0)
            num = 0;
        }
        return result;
    }
alert(count(books, search));
书籍=[
{
标题:“继承:继承周期,第四册”,
作者:“克里斯托弗·保利尼”,
},
{
标题:“结束的感觉”,
作者:“朱利安·巴恩斯”},
{
标题:“鼻烟世界小说39”,
作者:“特里·普拉切特爵士”,
}
]
搜索=提示(“标题?”);
函数计数(书本、模式){
var num=0;
var结果=[];
对于(i=0;i=0)
num=0;
}
返回结果;
}
警报(计数(书籍、搜索));

您需要保留计数,而不是在结果中找到它的索引。只有当索引大于或等于零时,才应增加计数。注意,我还进行了一些优化,以减少转换字符串所需的次数。我还添加了一个使用正则表达式的不同版本

function count(books, pattern) {
    var result = [];
    for (i = 0; i < books.length; i++) {
        var index = -1, // set to -1 so that the first iteration will set it to 0
            title = books[i].title.toLowerCase(),
            realPattern = pattern.toLowerCase();
        result[i] = 0;
        do {
            index = title.indexOf(pattern, index + 1);
            if (index >= 0) {
               result[i] = result[i] + 1;
            }
        }
        while (index >= 0)
    }
    return result;
}
函数计数(书本、模式){
var结果=[];
对于(i=0;i=0){
结果[i]=结果[i]+1;
}
}
而(索引>=0)
}
返回结果;
}
更好的选择

RegExp.escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}

function count(books, pattern) {
    var result = [];
    for (i = 0; i < books.length; i++) {
        var regex = new RegExp(RegExp.escape(pattern),'gi'),
            matches = books[i].title.match(regex);
        result[i] = matches ? matches.length : 0;
    }
    return result;
}
RegExp.escape=函数(文本){
返回text.replace(/[-[\]{}()*+?,\\^$\\s]/g,“\\$&”);
}
函数计数(书本、模式){
var结果=[];
对于(i=0;i
您可以使用for in循环,并将循环变量推送到results变量中


试试这个,它很简单

function count(books, pattern) 
{

var num = 0;
var result = Array();
for (i = 0; i < books.length; i++) 
{
    var times = books[i].title.toLowerCase().split(pattern.toLowerCase());
    if(times.length - 1 >= 0)result[i] = times.length - 1;
}
return result;
}
函数计数(书本、模式)
{
var num=0;
var result=Array();
对于(i=0;i=0)结果[i]=times.length-1;
}
返回结果;
}

希望你会觉得这个有用

使用
match
可以大大简化代码。我在这里做了一个JSFIDLE:看起来像这样:

var books = [
    {
        title: "Inheritance: Inheritance Cycle, Book 4",
        author: "Christopher Paolini",
    },
    {
        title: "The Sense of an Ending",
        author: "Julian Barnes"
    },
    {
        title: "Snuff Discworld Novel 39",
        author: "Sir Terry Pratchett",
    }
]
search = prompt("Title?");

function count(pattern)
{
    var results = [];
    var matches = null;
    pattern = new RegExp(pattern, "g")

    for (i = 0; i < books.length; i++) {
        results[i] = 0;
        matches = books[i].title.toLowerCase().match(pattern);
        if(matches != null) {
            results[i] = matches.length;
        }
    }
    return results
}

alert(count(search))
var书籍=[
{
标题:“继承:继承周期,第四册”,
作者:“克里斯托弗·保利尼”,
},
{
标题:“结束的感觉”,
作者:“朱利安·巴恩斯”
},
{
标题:“鼻烟世界小说39”,
作者:“特里·普拉切特爵士”,
}
]
搜索=提示(“标题?”);
函数计数(模式)
{
var结果=[];
var匹配=null;
模式=新的RegExp(模式“g”)
对于(i=0;i
您忘记用
var
声明“i”!那不是OP想要的。他想计算字符串中子字符串的出现次数。正则表达式为+1(我想知道为什么我没有想到)。无论如何,您应该提到,模式可能必须为特殊字符转义,并且您需要
g
lobal修饰符。@FelixKling我已经使用在上找到的转义代码对其进行了更新,我尝试将记录用于您的示例,但一直得到[Object]作为输出,我的意思是您需要这里的
g
修饰符:
var regex=new RegExp(RegExp.escape(pattern),'I')
:(否则它只匹配一次)@methuselah:这是意料之中的,因为
record
是一个对象
alert
是错误的调试工具,请使用控制台.log(在Chrome中工作,需要Firefox中的Firebug,不了解IE)。
var books = [
    {
        title: "Inheritance: Inheritance Cycle, Book 4",
        author: "Christopher Paolini",
    },
    {
        title: "The Sense of an Ending",
        author: "Julian Barnes"
    },
    {
        title: "Snuff Discworld Novel 39",
        author: "Sir Terry Pratchett",
    }
]
search = prompt("Title?");

function count(pattern)
{
    var results = [];
    var matches = null;
    pattern = new RegExp(pattern, "g")

    for (i = 0; i < books.length; i++) {
        results[i] = 0;
        matches = books[i].title.toLowerCase().match(pattern);
        if(matches != null) {
            results[i] = matches.length;
        }
    }
    return results
}

alert(count(search))