[Proposal] Array.prototype.includes should evaluate object.toString and/or object.valueOf when determining a match
If you want to check properties or methods of an array of objects, you can
use Array.prototype.some
.
It looks like you want included to use ==
for comparison, opening a whole
new world of issues.
You have some
and your code to do that with ease, same goes for find
or
findIndex
, very appropriate for this use case.
items.some(o => o == 'abc');
True, there are many other ways to make this work. You could even use filter(function(f){f.name==‘abc’;}).length > 0 .
The focus of this proposal is that the purpose of .valueOf and .toString are to allow for objects to return a default value without requiring the matching method to know about the contents or property names of any object.
Array.prototype.some, and any method mentioned above, require a that a content aware function be passed in to facilitate the match. This proposal mitigates that, and allows Array.prototype.includes to evaluate the object as the object design was intended.
You could even use filter(function(f){f.name==‘abc’;}).length > 0
not really, that's a long way to find what you are looking for, some
stops ASAP instead.
The focus of this proposal is that the purpose of .valueOf and .toString
I think those have valid use cases and changing a method already shipped long time ago to make use of those methods is surely not one of them.
This will never happen, you might have better luck proposing a new method (yet I have the feeling it won't happen neither because it's too easy to do on user land).
[Proposal] Array.prototype.includes should evaluate object.toString and/or object.valueOf when determining a match
The problem:
If I have a list of objects that contain a toString() prototype that returns a value from the object, Array.prototype.includes does not return true if the value/string returned from the object is a match for the parameter value.
Test code:
var thingy = function(name) {this.name=name;}; thingy.prototype.valueOf = function(){return this.name}; thingy.prototype.toString = function(){return this.name}; var items = [new thingy('abc'),new thingy('def')]; var inc = items.includes('abc'); alert(items[0]); // alerts abc alert(inc); // returns false
While it’s possible to create this as a list of strings using map, this would seem to conserve memory, as well as reduce the complexity of the code to perform this operation.
Link: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes