数组返回indexOf而不是模式计数
Array returning indexOf rather than count of pattern
所以我已经编辑了我的代码一点,我卡住了试图计数的次数一个模式出现在一个指定的记录
我希望数组返回为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));
您需要保留计数,而不是在result中找到它的索引。只有当索引大于或等于零时,才应该增加计数。注意,我还做了一些优化,以减少转换字符串所需的次数。我还添加了一个使用正则表达式的不同版本。
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;
}
更好的选择
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;
}
您可以使用for in循环并将循环变量压入results变量。
jsfiddle
var arr = ['a', 'b', 'c', 'a'];
function count(books, pattern) {
var results = [];
for (var index in arr) {
if (arr[index] === pattern) {
results.push(index);
}
}
return results;
}
console.log(count(arr, 'a'));
试试这个,非常简单:
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;
}
希望你会发现这是有用的!
使用match
可以大大简化代码。我在这里做了一个jsfiddle: http://jsfiddle.net/NTWNn/它看起来像这样:
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))
相关文章:
- 如何在模式框中显示ajax调用返回的数据
- 多次调用方法后返回相同promise的模式
- 如果返回false,如何在提交时关闭引导模式
- 如何使用lodash返回与模式匹配的属性数组
- 是否可以使find()和findOne()方法只返回模式字段
- Queryselect()在javascript模块模式中返回null
- jQuery - 用户单击模式上的“是”按钮后返回到初始屏幕
- 这是一种常见的模式吗?(返回数据而不是返回承诺)
- JavaScript 正则表达式,返回模式之前和之后的所有内容
- JavaScript 中的无意义的返回模式
- 是否可以使控制器返回模式窗口的数据?MVC5 ASP.NET
- 原型揭示模式和'这'嵌套函数或返回对象中
- 通过 JS 模块模式返回 ajax 响应
- 模式返回var &&var = = = & # 39;一些# 39;在javascript
- 关闭bootstrap模式返回按钮
- 为什么组合构造函数/原型模式返回对象类型
- javascript模块模式返回对象引用
- JavaScript模块模式-返回的对象===模块||facade
- Javascript链接模式返回该对象的等价项,而不是返回this
- Jquery点击打开模式返回“;undefined不是函数”;