Javascript objects are really nice, but sometimes they are missing some useful little functions/methods. The example above is with Arrays. It’s really nice to know whether or not an item is contained within your array. Well you can write a function that takes the array and the item you’re checking for, but it’s much cleaner to add the contains( item ) method to the Array object.
Extending JavaScript Arrays
/**
* 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;
}
Usage
// Now you can do things like:
var x = Array();
if (x.contains('foo')) {
// do something special
}
I suggest making it more strict,
to:
for example, 1 is the same as true. Unless you do ===
Thank you V1, you’re absolutely right. That should definitely be a ===.
“i” should be declared locally (by using a var statement). Currently you’re setting it as a global variable. Also, you shouldn’t be using the “for(i in something)” construct for arrays. Instead use a traditional for or while loop; they’re much quicker.
Here is how I would write it, coming in at a mere 83 kb minified:
Thank you, It really worked.
Nicer still would be to write it like this:
The Best in my opinion.
/**
* 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;
}
I rather to follow the lines of the String’s indexOf method.
this functionality already exists in most browsers, so with a simple feature detection you can add it to non supporting browsers:
obviously this does not return a boolean (if…!=-1) but you may want to know the first location of an object in an array so this comes in more handy, if you’re already there, you know..
You can modify it to go backwards on the array, on large arrays going backwards is usually quicker (for some reason), but then you’ll get the last place an object will appear in the array
why not using the native indexOf()-method?
+1 for @black.
arr.indexOf(v) > -1
looks short and sweet.
indexOf() is IE9+, boys.
The thing is, anyone using anything that does not support HTML5 is an out of date browser (and yes I am aware that Mozilla are dragging its knuckles on this one) and in real terms, while it is nice to support these old browsers, the actual usage of them is declining to levels where support in terms of cost, benefits, time and effort in maintaining that code outweighs the perceived benefits for a very small browser user group.
I would settle for this as a method covering most bases, simply stringify then test.
… and likely drawing criticism with the usual, yes it has no checks, you can’t nanny people, if people misuse a function or code, thats their look out…
If you want to make it more robust,
try
going along this path… :DAdding a try & catch means that you will control errors, therefore some level of checking is happening although what it does in control is up to you!
Use,
As you would expect, false is the result, “Bread” does not appear in the list, therefore the logical response is false.
So usefull!! really thanks bro! nice tip
EcmaScript 6 has you covered:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
Polyfill for ES5 included in the link at:
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Array/includes#Polyfill
I would add one more containsByKey(KeyName, KeyValue) for Objects with Keys stored in them
Object.prototype.contains = function (key, value) {
//Usage :
//selectedNodes.containsByKey(“node_id”, SelectedNode.node_id);
};