- 此问题在此处已有答案**:
(13个答案)
Functional use of Array.includes causes TypeError [duplicate](2个答案)
5天前关闭。
考虑以下数据:
const filters = ["c", "1"];
const data = [
{
name: 'a',
values: ["a", "b", "c"],
},
{
name: "b",
values: ["a", "z", "1"],
},
{
name: "c",
values: ["z", "y", "x"],
}
];
为了获取数据数组中值包含其中一个过滤器的所有对象,可以使用以下方法:
data.filter(entry => entry.values.some(v => filters.includes(v)));
根据我所知道的javascript规则,你可以放弃. some()调用中的anonymous/lambda函数,方法如下:
data.filter(entry => entry.values.some(filters.includes));
然而,这并不起作用,因为我们得到了错误TypeError: Cannot convert undefined or null to object
。然而,做下面的工作也使它工作,但多余的,我不明白为什么有必要:
const inc = (v) => filters.includes(v);
data.filter(entry => entry.values.some(inc));
这是V8引擎中的bug(我在chrome控制台和nodejs中试过)还是我不知道的技术限制?如果是,有人能给我解释一下吗?
4条答案
按热度按时间weylhg0b1#
这里有两个问题:
1)丢失
this
上下文:您将includes
作为someArray.includes
调用,即它需要someArray
作为this
上下文。由于丢失了this
,includes
将抛出一个错误,正如您碰巧观察到的那样。要解决此问题,您可以执行以下操作:
2)some向下传递多个参数,例如
item
、index
、array
等。顺便说一下,includes接受两个参数,即
item
和fromIndex
所以你实际上是在调用
filters.includes(value, index)
,其中index
第一次是0
,并且会随着some
方法的每次迭代而递增,这会导致你的fromIndex
被破坏--你总是希望它是0。因此,这将使您的代码无论如何都会失败(即使有第一个问题的解决方案)。
不建议执行上述修复。您最好只执行原始解决方案,即:
fruv7luv2#
函数include丢失了数组引用(this),当你把它作为函数some的处理程序直接传递的时候。
下面的代码片段实现了一个函数
fn
,其中两个函数与其原型相关联。函数
handler
,就像函数Array.includes
,在这里我用它来打印封闭作用域的信息。现在,为了说明问题,请看下面的代码片段,看看我们是如何绑定同一个对象的,并且一切正常。
imzjd6km3#
正如注解中提到的,
Array.includes
方法丢失了数组引用,因此您必须执行以下操作:但是,这将无法正常工作,因为
Array.includes
方法的签名将valueToFind
和一个可选的fromIndex
作为参数:arr.includes(valueToFind[, fromIndex])
Array.some
的回调将传递element
、index
和array
作为参数。fromIndex
参数将是当前元素的index
,这将导致意外行为。x1米11米1x
因此,很遗憾,您将不得不更加明确地将相关参数传递给
Array.includes
方法:bq3bfh9z4#
不可以。您不能使用
Array#includes
,例如由于
includes
的第二个参数(用于搜索 *fromIndex
*):此数组中开始搜索 *
valueToFind
* 的位置。对于正值 *
fromIndex
*,要搜索的第一个字符位于 *fromIndex
*;对于负值 *fromIndex
*,要搜索的第一个字符位于arr.length + fromIndex
(使用 *fromIndex
* 的absolute value作为从数组末尾开始搜索的字符数)。默认值为
0
。最后,您需要直接使用该值进行检查。