每个函数和Includes函数都是't使用Javascript
Each Function and Includes Function isn't working in Javascript
我正试图使用each函数在lodash上重新创建"includes"方法,但我的代码似乎没有按预期工作。我不知道为什么当我搜索数组中的目标时,返回的是false而不是true。这是我的代码:
var array = [1.1,1.3,2.3,2.5,3.1,3.5];
function each(set, call) {
for (var i =0; i<set.length; i++) {
call(set[i]);
};
};
function includes(collection, target) {
each(collection, function(element) {
if (element === target) {
return true;
}
});
return false;
}
console.log(includes(array, 1.1));
由于您根本没有使用call(set[i])
的返回值,因此在includes
中的lambda函数中包含return true
将不会产生任何影响。
用each
来定义includes
是没有意义的,因为当你找到一个匹配的值时,你将无法短路逻辑。
只需听取MDN的建议,并将includes
实现为for
循环:
function includes(collection, target) {
for(var i = 0; i < collection.length; i += 1) {
if (collection[i] === target) {
return true;
}
}
return false;
}
或者更好的是,使用indexOf
:
function includes(collection, target) {
return Array.prototype.indexOf.call(collection, target) !== -1;
}
如果你想用HOF来定义includes
,那么用some
或every
来定义它是有意义的。
使用some
:
function includes(collection, target) {
return some(collection, function (item) {
return item === target;
});
}
使用every
:
function includes(collection, target) {
return !every(collection, function (item) {
return item !== target;
});
}
这里some
和every
的一个简单实现是:
function some(collection, predicate) {
for (var i = 0; i < collection.length; i += 1) {
if(predicate(collection[i], i, collection)) {
return true;
}
}
return false;
}
function every(collection, predicate) {
for (var i = 0; i < collection.lenght; i += 1) {
if(!predicate(collection[i], i, collection)) {
return false;
}
}
return true;
}
它们也可以相互定义(当然,尽管不是同时定义):
// Creates the inverse of a function with the same parameters
function negate(func) {
return function () {
return !func.apply(this, arguments);
}
}
function some(collection, predicate) {
return !every(collection, negate(predicate));
}
function every(collection, predicate) {
return !some(collection, negate(predicate));
}
return true;
返回作为each
参数传递的函数的值,而不是includes
函数的值。
这应该是这样的:
function includes(set, target) {
for (var i = 0; i<set.length; i++) {
if (set[i] === target) return true;
};
return false;
}
为什么不使用indexOf
。
var array = [1.1,1.3,2.3,2.5,3.1,3.5];
function include(arr, i){
if(arr.indexOf(i)==-1) return false;
return true;
}
console.log(include(array,1.1));
原因布尔值返回给更接近的调用方(each()),而不是父调用方(includes())。它起作用:
function includes(collection, target) {
var retval = false;
each(collection, function(element) {
if (element === target) {
retval = true;
}
});
return retval;
}
然而,最好避免计算机的整个序列:
//it works with String and Array objects
function inSequence(searchValue, target){
if (-1 != target.indexOf(searchValue)) {
return true;
}
return false;
}
因此,调用includes(),让我们调用inSequence():
inSequence(1.1, array); //returns true
相关文章:
- 模拟chrome.storage.local函数使用Jasmine
- 对其他函数使用匿名函数's参数
- 表单中的数据不会传递给提交函数-使用Angular
- Node.js设计:多个异步函数使用作为闭包传递的函数写入数据库
- 函数使用 jquery 还原
- 删除两个函数使用的全局变量
- 从多个文件中推送文本的函数(使用html5文件读取器上传)返回数组
- 回调函数/使用.addClass添加类后运行函数
- 如何在JavaScript中跨多个函数使用全局变量
- 从指令调用控制器函数(使用从指令传递的参数)
- 提取并调用在元素的 onclick HTML 属性中定义的 JavaScript 函数(使用 jQuery attr/p
- 如何实例化其构造函数使用 yield 的对象
- 通过匿名函数使用 setInterval 的更好方法
- 在 ajax 中使用 json 对象成功函数(使用 angular.js)
- 两个函数使用相同的变量,都不会覆盖其原始变量
- 未定义不是这个和自我的函数使用
- JavaScript函数 - 使用引号内的参数
- 对多个函数使用相同的参数
- 如何在 Javascript 中添加和调用来自构造函数的函数(使用 JQuery)
- JavaScript undefined不是一个函数(使用splice函数)