Javascript 对象非常棒,但有时它们缺少一些有用的函数/方法。上面的示例是使用数组。了解你的数组中是否包含一个项目非常有用。当然,你可以编写一个接受数组和你要检查的项目的函数,但向 Array 对象添加 contains( item ) 方法要干净得多。
扩展 JavaScript 数组
/**
* Array.prototype.[method name] allows you to define/overwrite an objects method
* needle is the item you are searching for
* this is a special variable that refers to "this" instance of an Array.
* returns true if needle is in the array, and false otherwise
*/
Array.prototype.contains = function ( needle ) {
for (i in this) {
if (this[i] == needle) return true;
}
return false;
}
用法
// Now you can do things like:
var x = Array();
if (x.contains('foo')) {
// do something special
}
我建议使它更严格,
到
例如,1 等于 true。除非你使用 ===
谢谢 V1,你说得完全正确。这绝对应该是一个 ===。
“i” 应该在本地声明(使用 var 语句)。目前你将其设置为全局变量。此外,你不应该对数组使用“for(i in something)”结构。相反,使用传统的 for 或 while 循环;它们快得多。
以下是我如何编写它,仅 83 kb 压缩版
谢谢,它真的有效。
更棒的是这样写
在我看来,这是最好的。
/**
* is_array
*
* @param mixed input
* @return bol
*/
function is_array(obj) {
if (obj.constructor.toString().indexOf(‘Array’) == -1) {
return false;
}
return true;
}
/**
* contains
*
* @param mixed input
* @param string value
* @return bol
*/
function contains(input, value) {
if (!is_array(input)) {
if (input.indexOf(value) != -1) {
return true;
}
}
else {
var i = input.length;
while (i–) {
if (input[i] === value) {
return true;
}
}
}
return false;
}
我更愿意遵循 String 的 indexOf 方法。
此功能已存在于大多数浏览器中,因此只需进行简单的功能检测,你就可以将其添加到不支持的浏览器中
显然,这不会返回布尔值(if...!=-1),但你可能想知道对象在数组中的第一个位置,因此这更加方便,如果你已经在那里,你就知道...
你可以修改它在数组中向后移动,在大型数组中向后移动通常更快(出于某种原因),但随后你将获得对象在数组中出现的最后一个位置
为什么不使用本机的 indexOf() 方法?
+1 给 @black。
arr.indexOf(v) > -1
看起来简洁明了。
indexOf() 是 IE9+,伙计们。
问题是,任何使用不支持 HTML5 的东西的人都在使用过时的浏览器(是的,我知道 Mozilla 在这方面拖后腿),实际上,虽然支持这些旧浏览器很好,但它们的使用率正在下降到维护该代码的成本、效益、时间和精力超过了对非常小的浏览器用户群的感知效益的程度。
我将接受这种方法,因为它涵盖了大多数情况,只需将字符串化然后测试。
... 并且可能会因通常的批评而受到批评,是的,它没有检查,你不能管教别人,如果有人误用函数或代码,那是他们的错......
如果你想让它更健壮,可以尝试按照这条路线走下去... :D
添加 try & catch 意味着你将控制错误,因此某种程度的检查正在发生,尽管它控制的是什么取决于你!
使用,
正如你所预期的那样,false 是结果,“Bread” 未出现在列表中,因此合乎逻辑的响应是 false。
太棒了!!真的谢谢兄弟!很好的提示
EcmaScript 6 为你提供了解决方案
https://mdn.org.cn/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
ES5 的 polyfill 包含在以下链接中
https://mdn.org.cn/es/docs/Web/JavaScript/Referencia/Objetos_globales/Array/includes#Polyfill
我将再添加一个 containsByKey(KeyName, KeyValue) 用于存储在其中的键的对象
Object.prototype.contains = function (key, value) {
//用法
//selectedNodes.containsByKey(“node_id”, SelectedNode.node_id);
};